Azzurra IRC Network Forum

[C]read e write con socket

viridovix · 07/08/2005 04:08 · #1
Una volta che client e server sono collegati fra loro tramite socket con protocollo tcp(sotto linux),
il client offre all'utente ad esempio un menu di 3 scelte, da inserire tramite scanf o getchar,
l'utente puo inserire o il carattre a o il carattere b o il carattere c.(è un ciclo da cui si esce con questo carattere)
Se inserisce il carattere c allora con la write viene spedito al server che l olegge con la read e che di conseguenza invia al client u nmessagio tipo "disconnessione in corso", poi chiude il socket e si mette in ascolto x un 'altra connessione .
Il client invece ricevuto il messaggio lo stampa a video e termina .



questa è la parte di server interessata :

while(1)
{
while((ds_sock_acc=accept(ds_sock,&client,&lenght))==-1);
printf("client connesso!!\n\n");
if (fork()==0)
{ close(ds_sock);
do
{
read(ds_sock_acc,buff,MAX_DIM);
printf("messaggi client: %s\n",buff);
}
while (strcmp(buff,"c")!=0);
write (ds_sock_acc,"\n\nfatto",10);
close(ds_sock_acc);
printf("\nclient disconnesso!!\n\n");
printf("\nin attesa di connessione da nuovo client!\n\n");
exit(0);
}
else close(ds_sock_acc);
}//while(1)
}

questa è del client :

do
{printf("\nscelta a/b, c x uscire :");
scanf("%s",scelta);
while(getchar()!='\n');
if (strcmp(scelta,"a")==0)
{ printf("prima opzione");
write(ds_sock,scelta[0],1);
}
else if (strcmp(scelta,"b")==0)
{ printf("seconda opzione");
write(ds_sock,scelta[0],1);
}
}
while(strcmp(scelta,"c")!=0);
read(ds_sock,buff,MAX_DIM);
printf("\nmessaggio dal server%s\n\n",buff);
close(ds_sock);
}

in pratica nn so xchè ma i nquesto caso le read e write nn fanno il loro dovere, se inserisco ad esempio c , i lserver nn chiude la connessione e il client nn termina.
viridovix · 08/08/2005 19:38 · #2
Risolto aggiustando il codice e soprattutto aggiungendo questa:

in pratica dopo while(strcmp(scelta,"c")!=0);
ci voleva write(ds_sock,scelta,MAX_DIM); nel codice del client.
sottovento · 21/11/2005 14:25 · #3
Non basta ancora. Quando, per esempio, scrivi
write(ds_sock,scelta[0],1)
non spedisci alcun terminatore di stringa. Dall'altra parte riceverai una stringa non valida. Inoltre, quando ricevi dall'altra parte, non puoi dire quanto e' lunga una stringa.

E' sempre andato, finora, poiche' probabilmente il vettore di ricezione era inizializzato a zero.

ciao ciao
sottovento