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

static void error (const char *msg) 
{
    fprintf (stderr, "%s: %s\n", strerror (errno), msg);
    exit (-1);
}

int main (int argc,char **argv) 
{
    struct sockaddr_in server_addr;
    int         sock;
    char        buffer [1024]; 
    time_t      ticks; 

    if ((sock = socket (AF_INET,SOCK_DGRAM,0)) == -1)
        error ("error in creating a socket");

    memset (&server_addr, 0, sizeof server_addr);
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons (9090);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind (sock, (struct sockaddr *)&server_addr, sizeof server_addr) == -1) 
        error ("bind error");

    while (1) {
        struct sockaddr_in client_addr;
        socklen_t len = sizeof client_addr;
        int count;

        count = recvfrom (sock, buffer, sizeof buffer, 0, 
                          (struct sockaddr *) &client_addr, &len);

        if ( count < 0 )
            error ("error in recvfrom (...)");

        ticks = time (NULL); 
        snprintf(buffer, sizeof(buffer), "%.24s\r\n", ctime(&ticks));
        
        count = sendto (sock, buffer, strlen (buffer) + 1, 0, 
                        (struct sockaddr *)&client_addr, len);

        if ( count < 0 )
            error ("error in sendto (...)");
    }

    close (sock);
    return 0;
}
