Listing 4 (net_server.c)

/*
 * net_server.c
 *
 *  Server process for time accounting system, network version.
 *  This should be run as a daemon or in the background.
*/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include "time_entry.h"

main()
{

    int_skt_id,   /* Socket descriptor */
       msg_sock,  /* Socket that will accept messages */
       length,
       i,j;

    EVENT_TYPE event;    /* An event from one of the client processes */

    struct sockaddr_in sa;  /* Socket address structure */
    char buff[80];
    FILE *time_file;

      /* Open the output file in append mode */
      if(!(time_file = fopen(TIME_FILE, "a+"))){
          perror("Opening time file");
          exit(1);
      }

      fprintf(time_file, "\n***STARTUP***\n");

      /*
       * Create a stream type socket in the INTERNET domain, with the
       * default protocol.
      */
      skt_id = socket(AF_INET, SOCK_STREAM, 0);
      if(skt_id == -1){
          /* Error. Cleanup & leave */
          perror("Can't create socket");
          exit(1);
      }

      /*
       * Now that the socket exists, set up the address structure
       * and bind an address to the socket.
      */
      sa.sin_family = AF_UNIX;
      sa.sin_addr.s_addr = INADDR_ANY;  /* Any available address */
      sa.sin_port=0;                    /* Any port              */

      if(bind(skt_id, &sa, sizeof(sa)) == -1){
          perror("Can't bind address");
          exit(1);
      }

      /*
       * Find out the port number, since we asked for any available
      */

      length=sizeof(sa);
      if(getsockname(skt_id, &sa, &length)){
          perror("Can't find name");
          exit(1);
      }
      printf("Port: %d\n", ntohs(sa.sin_port));

      listen(skt_id, 5);  /* Set up the queue for requests */

      /*
       * Main loop is here. Accept a connection, read the message,
       * and write the time record...
      */

      do{
         /*
          * Accept a connection. Accept will return a new socket
          * descriptor with the same properties as the original. This
          * new socket is used for read and write
         */

      msg_sock = accept(skt_id, 0, 0);
      if(msg_sock == -1){
          perror("Can't accept connections");
          exit(1);
      }

      if(read(msg_sock, &event, sizeof(event)) < 0){
          perror("Read");
          exit(1);
      }
      if(event.event_cd != SHUT_DOWN){
          if (fwrite(&event, sizeof(event),1,time_file) != 1){
              perror("Write");
              exit(1);
          }
      }
      close(msg_sock);  /* Close the socket retruned by accept... */
  }while(event.event_cd != SHUT_DOWN);

  /* Cleanup */
  unlink(SOCKET_NAME);
  fprintf(time_file, "\n***SHUTDOWN***\n");
  fclose(time_file);
  exit(0);
}