/* A simple UDP example - receiver(signal-driven I/O version) */ #include #include #include #include #include #include #include #include #define MAX_MSG_SIZE 1000 // SIGIO signal handler void sig_io(int); // socket descriptor is global(since the signal handler needs it) int sockfd; int main(int argc, char* argv[]) { struct sockaddr_in recvAddr; int recvPort, flags; // check the number of arguments if (argc != 2) { printf("Usage : %s port-number\n", argv[0]); exit(-1); } // parse arguments recvPort = atoi(argv[1]); // fill out serverAddr memset(&recvAddr, 0, sizeof(recvAddr)); recvAddr.sin_family = PF_INET; recvAddr.sin_addr.s_addr = htonl(INADDR_ANY); recvAddr.sin_port = htons(recvPort); // register the SIGIO signal handler signal(SIGIO, sig_io); // socket if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) perror("socket"); // set the socket owner if (fcntl(sockfd, F_SETOWN, getpid()) < 0) perror("fcntl"); // enable signal-driven I/O(set socket async) flags = fcntl(sockfd, F_GETFL); fcntl(sockfd, F_SETFL, O_ASYNC); // bind if (bind(sockfd, (struct sockaddr*)&recvAddr, sizeof(recvAddr)) < 0) perror("bind"); // wait! while(1) ; return 0; } void sig_io(int signo) { struct sockaddr_in sendAddr; socklen_t len; char msg[MAX_MSG_SIZE]; ssize_t r; r = recvfrom(sockfd, msg, sizeof(msg), 0, (struct sockaddr*) &sendAddr, &len); if (r < 1) perror("recvfrom"); else printf("%s\n", (msg[r] = '\0',msg)); }