#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>

int main(int argc, char* argv[]){
	
	int list_socket;
	int cli_socket;
	int socklen;
	int ret;
	struct sockaddr_in	servaddr;
	struct sockaddr_in	cliaddr;
	char buffer[128];
	time_t ticks;
	
	list_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (list_socket == -1) {
		perror("socket() error");
		exit(1);
	}
	
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(2001);
	ret = bind(list_socket, 
			(struct sockaddr *) &servaddr, sizeof(servaddr));
	if (ret == -1) {
		perror("bind() error");
		exit(1);
	}
	
	ret = listen(list_socket, 5);
	if (ret == -1) {
		perror("listen() error");
		exit(1);
	}

	while(1) {
		socklen = sizeof(cliaddr);
		cli_socket = accept(list_socket,
			   	(struct sockaddr *) &cliaddr, &socklen);
		if (ret == -1) {
			perror("accept() error");
			exit(1);
		}
		
		printf("connection from %s, port %d\n",
				inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
		
		ret = read(cli_socket, (void *) &buffer, sizeof(buffer));
		buffer[ret] = '\0';
		
		printf("Request: %s\n", buffer);
		
		ticks = time(NULL);
		snprintf(buffer, sizeof(buffer), "%.24s\r\n", ctime(&ticks));
		write(cli_socket, buffer, strlen(buffer));
		
		close(cli_socket);
	}
	
}
