Salve a tutti,
è ormai un bel pò che sto sul problema che ora descriverò e non riesco a venirne a capo.
Devo scrivere un programma client/server che comunichi con socket. Il problema è che i programmi funzionano solo per il primo scambio di informazioni, mentre se ne infischiano di tutte le altre readline e writen (in particolare, il server stampa 'child terminato').
Non credo che possa postarvi tutto il codice, ma mi limito al client e al server. Comunque, tutte le funzioni che uso sono quelle che si utilizzano di solito e si possono trovare sui libri di Stevens e sul Gapil.
Ecco il server:
Ecco il client:codice:#include "basic.h" #include "my_signal.h" int main(int argc, char **argv){ pid_t pid; int lissd, connsd, n, qt, prezzo; struct sockaddr_in servaddr, cliaddr; socklen_t sock_len; char recvline[MAXLINE]; char sendline[MAXLINE]; char pin[3], codice[3], codp[3]; char utente[MAXLINE]; char descr[MAXLINE]; FILE *f,*p; if ( argc != 2 ) err_quit("utilizzo: server <port>"); if((lissd=socket(AF_INET,SOCK_STREAM,0))<0) err_sys("errore socket"); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(atoi(argv[1])); if( (bind(lissd, (SA *) &servaddr, sizeof(servaddr))) < 0) err_sys("errore in bind"); if( listen(lissd, LISTENQ) < 0 ) err_sys("errore in listen"); if( signal(SIGCHLD, gestisci_zombie) == SIG_ERR ) err_sys("errore nella signal"); for(;;){ sock_len=sizeof(cliaddr); if((connsd=accept(lissd,(SA *)&cliaddr, &sock_len))<0) if(errno==EINTR) continue; else err_sys("errore accept"); printf("Dati del client: %s %d\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port)); if( (pid = fork()) == 0 ) { if( close(lissd) == -1 ) err_sys("errore in close"); //doit //legge il pin if((n=readline(connsd, pin, MAXLINE))<0) err_sys("Errore readline 1"); pin[n-1]='\0'; //apre il file if((f=fopen("Clienti.txt","rw"))<0){ err_sys("errore apertura file"); } //scorro il file while(!feof(f)){ fscanf(f,"%s %s", codice, utente); //printf("-%s- -%s- -%s-\n",codice, utente, pin); if(strcmp(codice,pin)==0){ sprintf(sendline,"Benvenuto %s", utente); break; } else { sprintf(sendline,"Cliente non trovato"); } } //Messaggio benvenuto o errore if((n=writen(connsd,sendline,strlen(sendline)))<0) err_sys("Errore writen 1"); //leggo il nome del client o il codice del prodotto bzero(&recvline,sizeof(recvline)); if((n=readline(connsd,recvline,strlen(recvline)))<0) err_sys("Errore readline 2"); fputs(recvline,stdout); //fine doit if( close(connsd) == -1 ) err_sys("errore in close"); exit(0); } if( close(connsd) == -1 ) err_sys("errore in close"); } }
Ve ne sarei molto grato se mi aiutaste!!! Grazie. Ciao.codice:#include "basic.h" int main(int argc, char **argv) { int sockd, n; struct sockaddr_in servaddr; char recvline[MAXLINE]; char sendline[MAXLINE]; if ( argc != 3 ) err_quit("utilizzo: client <IPaddress> <port>"); 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(atoi(argv[2])); servaddr.sin_addr.s_addr = inet_addr(argv[1]); if ( connect(sockd, (SA *) &servaddr, sizeof(servaddr)) < 0 ) err_sys("errore in connect"); //doit printf("Inserisci il PIN:"); fgets(sendline,MAXLINE,stdin); //invia il pin if((n=writen(sockd,sendline,strlen(sendline)))<0) err_sys("Errore nella writen 1"); if((n=readline(sockd, recvline, MAXLINE))<0) err_sys("Errore readline 1"); printf("-%s-\n",recvline); //se il cliente non è registrato if(strcmp(recvline,"Cliente non trovato")==0){ printf("Inserisci il tuo nome:"); fgets(sendline,MAXLINE,stdin); } recvline[9]='\0'; if(strcmp(recvline,"Benvenuto")==0){ printf("Inserisci il codice del prodotto:"); fgets(sendline,MAXLINE,stdin); } //invio il nome o il codice del prodotto if((n=writen(sockd,sendline,strlen(sendline)))<0) err_sys("Errore nella writen 1"); //fine doit close(sockd); exit(0); }

Rispondi quotando