[ Bottom of Page | Previous Page | Next Page | Contents | Index | Library Home | Legal | Search ]

Communications Programming Concepts

Accepting UNIX Stream Connections Example Program

/*
 * This program creates a socket in the UNIX domain and binds a
 * name to it. After printing the socket's name, a loop begins.
 * Each time through the loop it accepts a connection and prints
 * out messages from it.  When the connection breaks, or a
 * termination message comes through, the program accepts a new
 * connection.
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define NAME "socket"
main()
{  
   int sock, msgsock, rval;
   struct sockaddr_un server;
   char buf[1024];
   /* Create socket. */
   sock = socket(AF_UNIX, SOCK_STREAM, 0);
   if (sock < 0) {
      perror("opening stream socket");
      exit(1);
   }
   /* Name socket using file system name. */
   server.sun_family = AF_UNIX;
   strcpy(server.sun_path, NAME);
   server.sun_len = strlen(server.sun_path);
   if (bind(sock, (struct sockaddr *)&server, SUN_LEN(&server))) {
      perror("binding stream socket");
      exit(1);
   }
   
   printf("Socket has name %s\n", server.sun_path);
   /* Start accepting connections. */
   listen(sock, 5);
   for (;;) {
     msgsock = accept(sock, 0, 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);
   }
 

   /* The following statements are not executed, because they
    * follow an infinite loop.  However, most ordinary programs
    * will not run forever. In the UNIX domain it is necessary to
    * tell the file system that you are through using NAME.  In
    * most programs you use the call unlink() as below.  Since
    * the user will have to kill this program,  it will be
    * necessary to remove the name with a shell command.
    */
   close(sock);
   unlink(NAME);
}

[ Top of Page | Previous Page | Next Page | Contents | Index | Library Home | Legal | Search ]