This program must be compiled with the -D_BSD and -lbsd options. For example, use the cc prog.c -o prog -D_BSD -lbsd command.
/* * This program uses select() to check that someone is trying to * connect before calling accept(). */ #include <sys/select.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #define TRUE 1 main() { int sock, length; struct sockaddr_in server; int msgsock; char buf[1024]; int rval; fd_set ready; struct timeval to; /* Create socket. */ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { perror("opening stream socket"); exit(1); } /* Name socket using wildcards. */ server.sin_family = AF_INET; server.sin_len = sizeof(server); server.sin_addr.s_addr = INADDR_ANY; server.sin_port = 0; if (bind(sock, &server, sizeof(server))) { perror("binding stream socket"); exit(1); }
/* Find out assigned port number and print it out. */ length = sizeof(server); if (getsockname(sock, &server, &length)) { perror("getting socket name"); exit(1); }
printf("Socket has port #%d\n", ntohs(server.sin_port));
/* Start accepting connections. */ listen(sock, 5); do { FD_ZERO(&ready); FD_SET(sock, &ready); to.tv_sec = 5; to.tv_usec = 0; if (select(sock + 1, &ready, 0, 0, &to) < 0) { perror("select"); continue; }
/* * When a select is done on a file descriptor of a socket * waiting to do an accept on the connection, a select * can be performed on the new descriptor to insure availability * of the data. * * In this example, after accept returns, a read is done, but * it would now be possible to select on the returned socket * descriptor to see if data is available. */
if (FD_ISSET(sock, &ready)) { msgsock = accept(sock, (struct sockaddr *)0, (int *)0); if (msgsock == -1) perror("accept"); else do { bzero(buf, sizeof(buf)); if ((rval = read(msgsock, buf, 1024)) < 0) perror("reading stream message"); else if (rval == 0) printf("Ending connection\n"); else printf("-->%s\n", buf); } while (rval > 0); close(msgsock); } else printf("Do something else\n"); } while (TRUE); }