Code:
/*
* M Y - D A Y - T I M E - S E R V E R . C
*
* Day time server. Uses port 13, needs root permissions to run!
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#define DAY_TIME_PORT 13
char *get_time_str() {
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
return asctime(timeinfo);
}
int main() {
struct sockaddr_in server_addr, client_addr;
int server_sock, client_sock;
socklen_t addr_size;
char *tmp;
if ((server_sock = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
return 1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(DAY_TIME_PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
memset(&server_addr.sin_zero, '\0', sizeof server_addr.sin_zero);
if (bind(server_sock, (struct sockaddr*) &server_addr, sizeof server_addr) == -1) {
perror("bind");
return 2;
}
if (listen(server_sock, SOMAXCONN) == -1) {
perror("listen");
return 3;
}
printf("server listening at 13...\n");
while (1) {
addr_size = sizeof client_addr;
memset(&client_addr, '\0', addr_size);
if ((client_sock = accept(server_sock, (struct sockaddr*) &client_addr, &addr_size)) == -1) {
perror("accept");
return 4;
}
tmp = get_time_str();
printf("Client: %s port: %x (hex) at: %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), tmp);
send(client_sock, tmp, strlen(tmp), 0);
shutdown(client_sock, 2);
close(client_sock);
}
return 0;
}