/*
* Copyright (C) 2011 Dag Jonny Nedrelid
*
* A Linux socket listener for receiving and saving character
* data (null terminated) in client-key ordered text files.
*/
#define SERVER_PORT "3982"
#define MAX_PENDING_CONNECTIONS SOMAXCONN
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
int listen_socket, work_socket;
int mail_socket, remote_addr_len;
struct addrinfo hints, *res;
struct sockaddr_storage remote_addr;
char recvBuf[1025];
char ClientKey[11];
FILE* serverLog;
int main()
{
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(NULL,SERVER_PORT,&hints,&res);
/* Initiate the listening socket */
if ((listen_socket = socket(res->ai_family,
res->ai_socktype,
res->ai_protocol)) == -1)
{
printf("Failed to create a listening socket.\n\n");
return 1;
}
/* Bind us to port SERVER_PORT */
if (bind(listen_socket,
res->ai_addr,
res->ai_addrlen) == -1)
{
printf("Failed bind to %s.\r\n",SERVER_PORT);
close(listen_socket);
return 1;
}
/* Set up listening */
if (listen(listen_socket,
MAX_PENDING_CONNECTIONS) == -1)
{
printf("Failed to set up listening.\n\n");
close(listen_socket);
return 1;
}
while ((work_socket = accept(listen_socket,
(struct sockaddr*)&remote_addr,
&remote_addr_len)) != -1)
{
/* First recv a client key for storage. */
recv(work_socket, ClientKey, sizeof(ClientKey), 0);
/* Save log to a local file. */
serverLog = fopen(ClientKey, "a+");
while (recv(work_socket,
recvBuf,
sizeof(recvBuf), 0) > 0)
{
fprintf(serverLog, "%s", recvBuf);
}
fclose(serverLog);
close(work_socket);
}
close(listen_socket);
return 0;
}