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:
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");
}
}
Ecco il client:
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);
}
Ve ne sarei molto grato se mi aiutaste!!! Grazie. Ciao.