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