int main(int argc, char *argv[]) { struct sockaddr_in echoServAddr; /* Server address */ unsigned short echoServPort; /* Server port */ struct sigaction handler; /* Signal handling action definition */ /* Test for correct number of parameters */ if (argc != 2) { fprintf(stderr,"Usage: %s <SERVER PORT>\n", argv[0]); exit(1); } echoServPort = atoi(argv[1]); /* First arg: local port */ /* Create socket for sending/receiving datagrams */ if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) DieWithError("socket() failed"); /* Set up the server address structure */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet family */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ echoServAddr.sin_port = htons(echoServPort); /* Port */ /* Bind to the local address */ if (bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("bind() failed"); /* Set signal handler for SIGIO */ handler.sa_handler = SIGIOHandler; /* Create mask that mask all signals */ if (sigfillset(&handler.sa_mask) < 0) DieWithError("sigfillset() failed"); /* No flags */ handler.sa_flags = 0; if (sigaction(SIGIO, &handler, 0) < 0) DieWithError("sigaction() failed for SIGIO"); /* We must own the socket to receive the SIGIO message */ if (fcntl(sock, F_SETOWN, getpid()) < 0) DieWithError("Unable to set process owner to us"); /* Arrange for nonblocking I/O and SIGIO delivery */ if (fcntl(sock, F_SETFL, O_NONBLOCK | FASYNC) < 0) DieWithError("Unable to put client sock into non-blocking/async mode"); /* Go off and do real work; echoing happens in the background */ for (;;) UseIdleTime(); /* NOTREACHED */ }
static void RunUDPEchoServer(bool is_connect,const char* service_str) { struct addrinfo addr_criteria; memset(&addr_criteria,0,sizeof(addr_criteria)); addr_criteria.ai_family = AF_UNSPEC; addr_criteria.ai_flags = AI_PASSIVE; addr_criteria.ai_socktype = SOCK_DGRAM; addr_criteria.ai_protocol = IPPROTO_UDP; struct addrinfo* serv_addr; int result = getaddrinfo(nullptr, service_str, &addr_criteria, &serv_addr); if (result != 0) { GUtility::DieWithUserMessage("getaddrinfo() failed", gai_strerror(result)); } serv_sock = socket(serv_addr->ai_family, serv_addr->ai_socktype, serv_addr->ai_protocol); if (serv_sock<0) { GUtility::DieWithSystemMessage("socket() failed"); } if (bind(serv_sock, serv_addr->ai_addr, serv_addr->ai_addrlen)<0) { GUtility::DieWithSystemMessage("bind() failed"); } freeaddrinfo(serv_addr); struct sigaction handler; handler.sa_handler = SIGIOHandler; if (sigfillset(&handler.sa_mask) < /* DISABLES CODE */ (0)) { GUtility::DieWithSystemMessage("sigfillset() failed"); } handler.sa_flags = 0; if (sigaction(SIGIO, &handler, 0)<0) { GUtility::DieWithSystemMessage("sigaction() failed for SIGIO"); } if (fcntl(serv_sock, F_SETOWN, getpid()) < 0) { GUtility::DieWithSystemMessage("Unable to set process owner to us"); } if (fcntl(serv_sock, F_SETFL, O_NONBLOCK|FASYNC) < 0) { GUtility::DieWithSystemMessage("Unable to put client sock into non-blocking/async mode"); } while (true) { UseIdleTime(); } }
int main (int argc, char *argv[]) { struct sockaddr_in echoServAddr; // Local address u16 echoServPort; // Server port struct sigaction handler; int rc; setprogname(argv[0]); if (argc != 2) { pr_usage("<UDP Server Port>"); } echoServPort = atoi(argv[1]); /* Create socket for sending/receiving datagrams */ Sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (Sock < 0) fatal("socket():"); /* Construct local address structure */ zero(echoServAddr); echoServAddr.sin_family = AF_INET; // Internet address family echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);// Any incoming interface echoServAddr.sin_port = htons(echoServPort);// Local port /* Bind to the local address */ rc = bind(Sock, (struct sockaddr *)&echoServAddr, sizeof(echoServAddr)); if (rc < 0) fatal("bind():"); /* Set signal handler for SIGIO */ handler.sa_handler = SIGIOHandler; /* Create mask that masks all signals */ if (sigfillset( &handler.sa_mask) < 0) fatal("sigfillset():"); handler.sa_flags = 0; /* Set signal handling for itnerrupt signals */ if (sigaction(SIGIO, &handler, 0) < 0) fatal("sigaction():"); /* We must own the socket to receive the SIGIO message */ if (fcntl(Sock, F_SETOWN, getpid()) < 0) { fatal("Unable to set process owner to us:"); } /* Arrange for nonblocking I/O and SIGIO delviery */ if (fcntl(Sock, F_SETFL, O_NONBLOCK | FASYNC) < 0) { fatal("Unable to put client sock into nonblocking/async mode:"); } for (;;) { UseIdleTime(); } }