PDA

Visualizza la versione completa : [C] Problemi con read e write nei socket


magsas
23-04-2009, 15:16
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:

#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_por t));

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:

#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.

magsas
25-04-2009, 12:21
Credo che il mio problema sia la terminazione prematura del client che invia il segnale SIGCHLD al padre.
Nessuno sa aiutarmi??

Loading