#include #include #include #include #include #include #include #define PORT 40000 static int server_fd; static struct sockaddr_in sock_address; static void createServer() { int opt = 1; // Creating socket file descriptor if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket failed"); exit(EXIT_FAILURE); } // // Forcefully attaching socket to the port 8080 // if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { // perror("setsockopt"); // exit(EXIT_FAILURE); // } sock_address.sin_family = AF_INET; sock_address.sin_addr.s_addr = INADDR_ANY; sock_address.sin_port = htons(PORT); // Forcefully attaching socket to the port if (bind(server_fd, (sockaddr*)&sock_address, sizeof(sock_address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } } int openSocket() { int sock; int addrlen = sizeof(sock_address); if ((sock = accept(server_fd, (sockaddr*)&sock_address, (socklen_t*)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } return sock; } static struct pollfd fdList[2]; int main() { createServer(); fdList[0].fd = STDIN_FILENO; fdList[0].events = POLLIN; while (true) { int sock = openSocket(); printf("Connected fd=%d\n", sock); fdList[1].fd = sock; fdList[1].events = POLLIN; while (true) { if (poll(fdList, 2, -1) < 1) { continue; } if (fdList[1].revents & POLLNVAL) { printf("POLLNVAL\n"); break; } if (fdList[1].revents & POLLHUP) { printf("closed by peer\n"); close(fdList[1].fd); break; } if (fdList[1].revents & POLLIN) { char buff[1024]; ssize_t size = read(fdList[1].fd, buff, sizeof(buff)); if (size < 0) { printf("closed by peer\n"); break; } write(STDOUT_FILENO, buff, size); } // получены данные из STDIN if (fdList[0].revents & POLLIN) { char buff[1024]; ssize_t size = read(fdList[0].fd, buff, sizeof(buff)); if (size < 0) { printf("stdin EOL\n"); return 0; } write(fdList[1].fd, buff, size); } } // closing the connected socket close(sock); // closing the listening socket shutdown(server_fd, SHUT_RDWR); } }