#include #include #include #include #include #include #include #include #include typedef struct sockaddr_in SockAddr_in; typedef struct sockaddr SockAddr; SockAddr_in addr; socklen_t addr_size; int socket_fd; void handle_error(char *txt) { perror(txt); exit(-1); } void receive_urgent() { double dd; if (recvfrom(socket_fd, &dd, sizeof(double), MSG_OOB, (SockAddr *)&addr, &addr_size) == -1) handle_error("recvfrom urgent"); printf("dd: %f\n", dd); signal(SIGURG, receive_urgent); } int main() { if ((socket_fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1) handle_error("socket"); addr_size = sizeof(SockAddr_in); memset(&addr, 0, addr_size); addr.sin_port = htons(4040); addr.sin_family = PF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); // inet_pton(AF_INET, "127.0.0.1", &(addr.sin_addr.s_addr)); if (bind(socket_fd, (SockAddr *)&addr, addr_size) == -1) handle_error("bind"); double dd; for (;;) { fcntl(socket_fd, F_SETOWN, getpid()); signal(SIGURG, receive_urgent); int bytes = recvfrom(socket_fd, &dd, sizeof(double), 0, (SockAddr *)&addr, &addr_size); if (bytes == -1) handle_error("recvfrom"); if (bytes == 0) { printf("EOF\n"); } printf("dd: %f\n", dd); } if (close(socket_fd) == -1) handle_error("close"); return 0; }