[ Next Article | Previous Article | Book Contents | Library Home | Legal | Search ]
Communications Programming Concepts

Checking for Pending Connections Example Program

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);
}

[ Next Article | Previous Article | Book Contents | Library Home | Legal | Search ]