#include #include #include #include #include #include #include #include #include typedef struct sockaddr_in SockAddr_in; typedef struct sockaddr SockAddr; SockAddr_in addr; SockAddr_in addr_client; socklen_t addr_size; int socket_fd; int client_socket; void handle_error(char *txt) { perror(txt); exit(-1); } void receive_urgent(int signo) { double dd; printf("OOB received\n"); if (recv(client_socket, &dd, sizeof(double), MSG_OOB) == -1) handle_error("recv urgent"); printf("urgent dd: %f\n", dd); signal(SIGURG, receive_urgent); } void end_connection() { if (close(socket_fd) == -1) handle_error("close"); exit(0); } int main() { signal(SIGINT, end_connection); signal(SIGTERM, end_connection); if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) handle_error("socket"); printf("socket success\n"); addr_size = sizeof(SockAddr_in); memset(&addr, 0, addr_size); addr.sin_port = htons(4040); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(socket_fd, (SockAddr *)&addr, addr_size) == -1) handle_error("bind"); printf("bind success\n"); if (listen(socket_fd, 10) == -1) handle_error("listen"); printf("listen success\n"); double dd; for (;;) { if ((client_socket = accept(socket_fd, (SockAddr *)&addr_client, &addr_size)) == -1) handle_error("accept"); printf("accept success\n"); int i; if ((i = fork()) == -1) handle_error("fork"); printf("fork success\n"); if (i == 0) { close(socket_fd); signal(SIGURG, receive_urgent); fcntl(client_socket, F_SETOWN, getpid()); for (;;) { int bytes = read(client_socket, &dd, sizeof(double)); if (bytes == -1) handle_error("recvfrom"); if (bytes == 0) { printf("EOF\n"); break; } else { printf("dd: %f\n", dd); } } close(client_socket); return 0; } else { sigignore(SIGCHLD); close(client_socket); } } return 0; }