Listing 2 (server.c)
/* * Server process for time accounting system, non-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 */ i,j; EVENT_TYPE event; /* An event from one of the client processes */ struct sockaddr 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 UNIX domain, with the * default protocol. */ skt_id = socket(AF_UNlX, 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.sa_family = AF_UNIX; strcpy(sa.sa_data, SOCKET_NAME); if(bind(skt_id, &sa, sizeof(sa)) == -1){ perror("Can't bind address"); exit(1); } 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); }