#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>

extern int h_errno;

void showAddr (char *msg, struct sockaddr_in *saddr) {
  char *ptr_addr = &(saddr->sin_addr.s_addr);
  printf ("%s %u.%u.%u.%u:%u\n", msg, (unsigned char) ptr_addr[0],
	  (unsigned char) ptr_addr[1], (unsigned char) ptr_addr[2],
	  (unsigned char) ptr_addr[3], ntohs (saddr->sin_port));
}
int main(int argc, char** argv){
  int lport_h = 37; 	/* porta utilizzata */
  struct sockaddr_in saddr, caddr;
  int s, s1;
  int result;
  struct tm current;
  char * ts;
  
  s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  saddr.sin_family = AF_INET;
  saddr.sin_port = htons(lport_h);
  saddr.sin_addr.s_addr	= INADDR_ANY;

  result = bind(s, (struct sockaddr *) &saddr, sizeof(saddr));

  result = listen(s, 20);

  while(1){
    int addrlen = sizeof(struct sockaddr_in);
    s1 = accept(s, (struct sockaddr *) &caddr, &addrlen);
    showAddr("Telling time to",&caddr);

    time_t t = time(NULL);
    ts = ctime(&t);    
    send(s1,ts,strlen(ts)+1,0);

    close(s1);
  }

  return 0;
}
