Listing 3: SocketServer.c.

#include "SocketServer.h"
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include "TimeUtils.h"

#define MAX_BUF 32
int startSocketServer(int port) {
    struct    sockaddr_in server_addr;
    int       listen_sd;
    int       connect_sd;
    char      buf[MAX_BUF];
    struct tm currentDateTime;
    fprintf(stdout, "Starting socket server on port %d\n", port);
    /*  Create a listening socket  */
    if ( (listen_sd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
        fprintf(stderr, "Error creating listening socket.\n");
        return -1;
    }
    /*  Configure socket */
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family      = AF_INET;
    server_addr.sin_port        = htons(port);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    /*  Bind socket to port */
    if (bind(listen_sd, (struct sockaddr *) &server_addr,
            sizeof(server_addr)) < 0 ) {
        fprintf(stderr, "Error binding to port\n");
        return -1;
    }
    /* Start listening */
    if ( listen(listen_sd, 1024) < 0 ) {
        fprintf(stderr, "Error listening on port\n");
        return -1;
    }
    // Simple server. Single threaded/process only
    while ( 1 ) {
        if ((connect_sd = accept(listen_sd, NULL, NULL)) < 0 ) {
            fprintf(stderr, "Error receiving connection\n");
            return -1;
        }
        currentDateTime = getCurrentDateTime();
        strftime(buf, MAX_BUF-1, "%b %d, %Y %H:%M:%S\n",
                &currentDateTime);
        if (write(connect_sd, buf, strlen(buf)) < 0 ) {
            fprintf(stderr, "Error writing to client\n");
            return -1;
         }
         if ( close(connect_sd) < 0 ) {
             fprintf(stderr, "Error closing socket\n");
             return -1;
         }
    }
}