#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <sys/timeb.h>
#include <string.h>

#define BYTES_NR	1024



#define DEFAULTPORT 3001



char	buf[BYTES_NR];
char    line[BYTES_NR];




main(argc,argv)
     int argc;char *argv[];
{
  int	sock,length,  numerolinea, lunghezzalinea;
 struct 	sockaddr_in 	server,client;
 int	msgsock,rval,i;
 struct	hostent	*hp,*gethostbyname();
 int myport;
 FILE *fp;

if(argc >2)
  {
    fprintf(stderr,"Uso: %s [portaserver]\n",argv[0]);
    exit(-1);
  }


  if(argc == 2)
    myport = atoi(argv[1]);
  else
    myport = DEFAULTPORT;
  
  if((myport < 1024  && myport != 0)|| myport > 65535)
    {
      fprintf(stderr, "Il numero di porta puo essere 0 (per ottenerne una libera)\noppure deve essere compresa tra 1024 e 65535\n");
      exit(-1);
    }


/* Crea la socket DGRAM */
sock=	socket(AF_INET,SOCK_DGRAM,0);
if(sock<0)
	{
	perror("open sulla socket dgram");
	exit(1);
	}

/* Name socket using wildcards */
server.sin_family = 	AF_INET;
server.sin_addr.s_addr= INADDR_ANY;
server.sin_port = htons(myport);

if (bind(sock,(struct sockaddr *)&server,sizeof server)<0)
	{
	perror("bind sulla socket dgram");
	exit(1);
	}

/* Find out assigned port and print out */
length= sizeof server;
if(getsockname(sock,(struct sockaddr *)&server,&length)<0)
	{
	perror("getsockname");
	exit(1);
	}

printf("Server attivo sulla porta #%d\n",ntohs(server.sin_port));

 do{
   bzero(buf,sizeof buf); 
   if((rval = recvfrom(sock,buf,sizeof buf, 0, (struct sockaddr *)&client, (socklen_t *)&length ))<0)
     {
     perror("recvfrom sulla socket dgram: ");
     exit(-3);
     }
   
 printf("Il client IP=%s porta=%d richiede il file %s\n",inet_ntoa(client.sin_addr), client.sin_port, buf);
 
 
 
 if((fp=fopen(buf,"r"))==NULL)
   {
     perror("open sul file: ");
     //     exit(-3);
   }
 
 numerolinea= 0;
 
 while(!feof(fp))
   {
     fgets(line, sizeof line, fp);

     numerolinea++;
     
     sprintf(buf,"%d %s", numerolinea, line);
     
     lunghezzalinea= strlen(buf);
     
     if(sendto(sock,buf,lunghezzalinea,0,(struct sockaddr *)&client,sizeof client)<0)
       {
	 perror("recvfrom sulla socket dgram");
	 exit(-4);
       }
   }

 strcpy(buf,"#bye#");

     if(sendto(sock,buf,strlen(buf)+1,0,(struct sockaddr *)&client,sizeof client)<0)
       {
	 perror("recvfrom sulla socket dgram");
	 exit(-4);
       }
   
 
 
 printf("Trasmissione file completata\n");

 } /* ^C o un altro segnale per farlo terminare */
 while(1);
}




