Sia il server che il client non sono stati scritti interamente da me, ma solo in parte, ecco il codice
il clientcodice:int main(int argc, char **argv){ pid_t pid; int listensd, connsd; struct sockaddr_in servaddr, cliaddr; socklen_t servaddr_len, cliaddr_len; char buff[MAXLINE]; char msg[MAXLINE] = "prova di utilizzo di getsockname()"; time_t ticks; FILE *file; if( (listensd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err_sys("errore in socket"); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(4444); int tr=1; // permette il riutilizzo della porta if (setsockopt(listensd,SOL_SOCKET,SO_REUSEADDR,&tr,sizeof(int)) == -1){ err_sys("errore in setsockopt"); exit(1); } if( (bind(listensd, (SA *) &servaddr, sizeof(servaddr))) < 0) err_sys("errore in bind"); if( listen(listensd, LISTENQ) < 0 ) err_sys("errore in listen"); getsockname(listensd, (SA *) &servaddr, &servaddr_len); /* ottiene l'indirizzo IP ed il numero di porta assegnati al socket di ascolto */ inet_ntop(AF_INET, &servaddr.sin_addr, buff, sizeof(buff)); /* estrae dalla struct sockaddr_in l'indirizzo IP e lo copia come stringa in un buffer */ printf("Socket di ascolto: \tIndirizzo IP %s, porta %d\n", buff,ntohs(servaddr.sin_port)); for ( ; ; ) { cliaddr_len = sizeof(cliaddr); if( (connsd = accept(listensd, (SA *) &cliaddr, &cliaddr_len)) < 0) err_sys("errore in accept"); getsockname(connsd, (SA *) &servaddr, &servaddr_len); /* ottiene l'indirizzo IP ed il numero di porta assegnati al socket di connessione restituito dall'accept */ inet_ntop(AF_INET, &servaddr.sin_addr, buff, sizeof(buff)); printf("Socket di connessione: \tIndirizzo IP %s, porta %d\n", buff, ntohs(servaddr.sin_port)); printf("Indirizzo del peer: \tIndirizzo IP %s, porta %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)), ntohs(cliaddr.sin_port) ); /* stampa indirizzo IP e numero di porta del client.Non serve chiamare getpeername */ if((pid = fork()) == 0 ){ if( close(listensd) == -1 ) err_sys("errore in close"); //------------------------------------------------------------------------------- char indirizzo[11],i[100],dominio[100],nomefile[10]; int flag=0,n=0; n = read(connsd, nomefile, sizeof(nomefile)); nomefile[n] = '\0'; printf("%s la cui lunghezza è %d\n",nomefile,strlen(nomefile)); if((file=fopen(nomefile,"r"))==NULL) { err_sys("File inesistente"); exit(1); } getsockname(connsd, (SA *) &servaddr, &servaddr_len); inet_ntop(AF_INET, &servaddr.sin_addr,indirizzo, sizeof(indirizzo)); // printf("Socket di ascolto: \tIndirizzo IP %s, porta %d\n",indirizzo, ntohs(servaddr.sin_port)); while(fscanf(file,"%s %s",i,dominio)!=EOF){ if ((strcmp(indirizzo,i)) == 0) { flag=1; break; } } fclose(file); if(!flag) strcpy(dominio,"Servizio non disponibile"); sprintf(msg,"%s\n",dominio); //-------------------------------------------------------------------------------- if( (write(connsd, msg, strlen(msg)) != strlen(msg)) ) err_sys("errore in write"); if( close(connsd) == -1 ) err_sys("errore in close"); exit(0); } if( close(connsd) == -1 ) err_sys("errore in close"); } }
l'area delimitata dalla tratteggiatura è stata modificata da me, il resto è stato fatto dal prof.codice:int main(int argc, char **argv){ int sockd, n; char buff[MAXLINE], recvline[MAXLINE + 1],sendline[MAXLINE]; struct sockaddr_in servaddr, localaddr, peeraddr; socklen_t localaddr_len, peeraddr_len; if ( argc != 3 ) err_quit("utilizzo: sockname_client <IPaddress>"); if ((sockd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) err_sys("errore in socket"); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(4444); if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0 ) err_quit("errore in inet_pton per %s", argv[1]); if ( connect(sockd, (SA *) &servaddr, sizeof(servaddr)) < 0 ) err_sys("errore in connect"); localaddr_len = sizeof(localaddr); getsockname(sockd, (SA *) &localaddr, &localaddr_len); /* ottiene l'indirizzo Ip ed il numero di porta assegnati dal sistema operativo alla connessione con endpoint identificato da sockd */ printf("Indirizzo locale: indirizzo IP %s, porta %d\n",inet_ntop(AF_INET, &localaddr.sin_addr, buff, sizeof(buff)),ntohs(localaddr.sin_port)); peeraddr_len = sizeof(peeraddr); getpeername(sockd, (SA *) &peeraddr, &peeraddr_len); /* ottiene l'indirizzo Ip ed il numero di porta del peer nella connessione identificata da sockd.L'altro endpoint è identificato dal socket di comunicazione del server e non dal socket di ascolto. */ printf("Indirizzo del peer: indirizzo IP %s, porta %d\n",inet_ntop(AF_INET, &peeraddr.sin_addr, buff, sizeof(buff)),ntohs(peeraddr.sin_port)); sprintf(sendline,"%s%c",argv[2],'\0'); printf("%s la cui dimensione e %d\n",sendline,strlen(sendline)); if( writen(sockd, sendline, strlen(sendline)) != strlen(sendline) ) err_sys("errore in write"); if( (n = read(sockd, recvline, MAXLINE)) < 0 ) err_sys("errore in read"); recvline[n] = 0; printf("%s", recvline); exit(0); }

Rispondi quotando