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",
¤tDateTime);
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;
}
}
}