The contents of this page are licensed under the following license
BSD Sockets
Synchronous I/O multiplexing with function select |
#include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/param.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #define SERVER_PORT 1234 #define QUEUE_SIZE 5 int main(int argc, char* argv[]) { int nSocket, nClientSocket; int nBind, nListen; int nFoo = 1, nTmp, nMaxfd, nFound, nFd; struct sockaddr_in stAddr, stClientAddr; static struct timeval tTimeout; fd_set fsMask, fsRmask, fsWmask; /* address structure */ memset(&stAddr, 0, sizeof(struct sockaddr)); stAddr.sin_family = AF_INET; stAddr.sin_addr.s_addr = htonl(INADDR_ANY); stAddr.sin_port = htons(SERVER_PORT); /* create a socket */ nSocket = socket(AF_INET, SOCK_STREAM, 0); if (nSocket < 0) { fprintf(stderr, "%s: Can't create a socket.\n", argv[0]); exit(1); } setsockopt(nSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&nFoo, sizeof(nFoo)); /* bind a name to a socket */ nBind = bind(nSocket, (struct sockaddr*)&stAddr, sizeof(struct sockaddr)); if (nBind < 0) { fprintf(stderr, "%s: Can't bind a name to a socket.\n", argv[0]); exit(1); } /* specify queue size */ nListen = listen(nSocket, QUEUE_SIZE); if (nListen < 0) { fprintf(stderr, "%s: Can't set queue size.\n", argv[0]); } FD_ZERO(&fsMask); FD_ZERO(&fsRmask); nMaxfd = nSocket; nTmp = sizeof(struct sockaddr); while(1) { /* block for connection request -- timeout after 5 sec. */ FD_SET(nSocket, &fsRmask); fsWmask = fsMask; tTimeout.tv_sec = 5; tTimeout.tv_usec = 0; printf("select...\n"); nFound = select(nMaxfd + 1, &fsRmask, &fsWmask, (fd_set*) 0, &tTimeout); if (nFound < 0) { fprintf(stderr, "%s: Select error.\n", argv[0]); } if (nFound == 0) { printf("%s: Timed out.\n", argv[0]); fflush(stdout); } if (FD_ISSET(nSocket, &fsRmask)) { nClientSocket = accept(nSocket, (struct sockaddr*)&stClientAddr, &nTmp); if (nClientSocket < 0) { fprintf(stderr, "%s: Can't create a connection's socket.\n", argv[0]); exit(1); } /* connection */ printf("%s: [connection from %s]\n", argv[0], inet_ntoa((struct in_addr)stClientAddr.sin_addr)); FD_SET(nClientSocket, &fsMask); if (nClientSocket > nMaxfd) nMaxfd = nClientSocket; } for (nFd = 0; nFd <= nMaxfd; nFd++) { if (FD_ISSET(nFd, &fsWmask)) { printf("%s: [sending string to %s]\n", argv[0], inet_ntoa((struct in_addr)stClientAddr.sin_addr)); write(nFd, "Hello World!\n", 13); FD_CLR(nFd, &fsMask); close(nFd); } } } close(nSocket); return(0); } |
August, 23rd 2006 © Michał Kalewski