#include #include #include #include #include #include #include #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 *)&client,&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])); /* Nome dal file da richiedere al server */ 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); }