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

#include <unistd.h>


#define BYTES_NR	1024

char	buf[BYTES_NR];



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

if(argc !=4)
  {
    fprintf(stderr,"Usage: %s servername serverport nomefile\n",argv[0]);
    exit(-1);
  }



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


client.sin_family=	AF_INET;
client.sin_addr.s_addr = INADDR_ANY;
client.sin_port = htons(0);

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

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

/* Ottiene l'indirizzo IP del server */
hp = gethostbyname(argv[1]);
if (hp == 0)
	{
	fprintf(stderr,"%s : nodo sconosciuto",argv[1]);
	exit(2);
	}
bcopy( (char *)hp ->h_addr, (char *)&server.sin_addr,hp ->h_length);
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[2]));


 strcpy(buf, argv[3]);


 if(sendto(sock,buf,sizeof buf,0,(struct sockaddr *)&server,sizeof server)<0)
   perror("sendto problem");

 completato= 0;
do
  {
	if((rval = recvfrom(sock,buf,sizeof buf, 0, (struct sockaddr *)NULL, (socklen_t *)NULL))<0)
	  {
	    perror("recvfrom sulla socket dgram");
	    exit(-3);
      }

	if(!strcmp(buf,"#bye#"))
	  {
	  completato = 1 ;
	  continue;
	  }
	else
	  sscanf(buf,"%d",&numerolinea);

	printf("Linea %d ricevuta\n",numerolinea);

}
 while(!completato); 

 printf("Ricezione file completata\n"); 
 close(sock);



}




