#include #include #include #include #include #include #include #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 #include #include #include #include #include /** 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; }