#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define PID_CHILD 0
#define SERVER_PORT 8080
#define CLIENT_PORT 8000
const char password[] = "aabbcc";
/**
* Функция, в которой будут ожидаться сообщения от клиента
* @param clientfd - сокет клиента
*/
void listenClient(int clientfd) {
printf("Клиент подключился\n");
char buf[256];
while (true) {
int length = recv(clientfd, buf, sizeof(buf), 0);
if (length <= 0) {
printf("Клиент отключился\n");
return;
}
buf[length] = '\0';
if (strncmp(buf, password, strlen(password)) != 0) {
// Пароль не правильный
printf("Пароль не верный: %s\n", buf);
sprintf(buf, "Пароль не верный");
send(clientfd, buf, strlen(buf), 0);
}else {
printf("Пароль верный: %s\n", buf);
sprintf(buf, "Пароль верный");
send(clientfd, buf, strlen(buf), 0);
}
}
}
int main() {
// Создаем сокет
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
assert(sockfd != -1 && "Error: can't create socket");
printf("Socket created\n");
// Создаем локальный адрес
struct sockaddr_in local_addr = {
.sin_family = AF_INET,
.sin_port = htons(SERVER_PORT),
.sin_addr = { .s_addr = INADDR_ANY }
};
// Биндим сокет
int result = bind(sockfd, (struct sockaddr *) &local_addr, sizeof(local_addr));
assert(result != -1 && "Error: can't bind socket");
printf("Socket binded\n");
while (true) {
// Ожидаем подключение нового клиента
result = listen(sockfd, 5);
assert(result != -1 && "Error: can't listen socket");
struct sockaddr_in client_addr = { 0 };
socklen_t addr_len = sizeof(client_addr);
int clientfd = accept(sockfd, (sockaddr *) &client_addr, &addr_len);
assert(result != -1 && "Error: can't accept connection");
int pid = fork();
assert(pid != -1 && "Error: can't create child process");
if (pid == PID_CHILD) {
listenClient(clientfd);
return 0;
}
}
}
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> /** inet_addr() */
#define SERVER_PORT 8080
#define CLIENT_PORT 8000
int main() {
// Создаем сокет IPPROTO_IP
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
assert(sockfd != -1 && "Error: can't create socket");
printf("Socket created\n");
// Создаем локальный адрес
struct sockaddr_in local_addr = {
.sin_family = AF_INET,
.sin_port = htons(CLIENT_PORT),
.sin_addr = { .s_addr = INADDR_ANY }
};
// Биндим сокет
int result = bind(sockfd, (struct sockaddr *) &local_addr ,sizeof(struct sockaddr_in));
assert(result != -1 && "Error: can't bind socket");
printf("Socket binded\n");
// Создаем адрес сервера
struct sockaddr_in remote_addr = {
.sin_family = AF_INET,
.sin_port = htons(SERVER_PORT),
.sin_addr = { .s_addr = inet_addr("127.0.0.1") },
};
result = connect(sockfd, (sockaddr*) &remote_addr, sizeof(remote_addr));
assert(result != -1 && "Error: can't connect to server");
printf("Connected to server\n");
char buf[256];
while (true) {
// Запрашиваем пароль
printf("Введите пароль: ");
fflush(stdout);
scanf("%s", buf);
// Отправляем пароль на сервер
send(sockfd, buf, strlen(buf), 0);
// Получаем ответ
int length = recv(sockfd, buf, sizeof(buf), 0);
assert(length != -1 && "Error: can't receive message");
buf[length] = '\0';
printf("[SERVER] %s\n", buf);
}
return 0;
}
Comments
0 B
|👍
/👎