#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <time.h>


int main(int argc, char *argv[])
{
  char buf[26];
  time_t ticks;
  int sock, msgsock, rval, portno;
  socklen_t length;
  struct sockaddr_in server;	
  struct hostent *hp;

  printf("\n*-----------------------------------------------*\n");
  printf("*                                               *\n");
  printf("*         SERVER data e ora correnti            *\n");
  printf("*                                               *\n");
  printf("* ^c per terminare!                             *\n");
  printf("*                                               *\n");
  printf("*-----------------------------------------------*\n\n");
  
  sock=	socket(AF_INET,SOCK_STREAM,0);    /* Crea la  socket STREAM */
  if(sock<0)
  {	
    perror("opening stream socket");
    exit(1);
  }
  portno = atoi(argv[1]);

  server.sin_family = AF_INET;         /* Utilizzo della wildcard per*/ 
  server.sin_addr.s_addr= INADDR_ANY;  /* accettare le connessioni da ogni client */
  server.sin_port = htons(portno);
  if (bind(sock,(struct sockaddr *)&server,sizeof server)<0)
    {
      perror("binding stream socket");
      exit(1);
    }


  length= sizeof server;
  if (getsockname(sock,(struct sockaddr *)&server,&length)<0)
  {
    perror("getting socket name");
    exit(1);
  }
  printf("Socket port #%d\n\n",ntohs(server.sin_port));

  
  listen(sock,2); /* Pronto ad accettare connessioni */

  do
  {       	 	  
    msgsock= accept(sock,(struct sockaddr *)0,(socklen_t *)0); /* Attesa di una connessione */
    if(msgsock ==-1)
      perror("accept");
    else
    {	    
      ticks = time(NULL);              /*calcola data e ora corrente*/
      strcpy(buf,ctime(&ticks));      /*la converte in stringa e la memorizza in buf[26]*/
      if((rval = write(msgsock,buf,sizeof buf))<0)  /* Invio dell'informazione */
        perror("writing on stream socket");
      printf("%d byte scritti\n",rval);	      
    } 
    close (msgsock);
  }
  while(1);
  return 0;
}



