PDA

View Full Version : [C] - Invio tizio... Arriva caio


clockover
13-06-2010, 12:51
Includo questi due spezzoni di codice
Proceso Server
bzero(buffer, MAX_BUFFER);
//lettura della richiesta
letti = read(sock_ds, buffer, MAX_BUFFER);
if(letti == -1){
bzero(buffer, MAX_BUFFER);
sprintf(buffer, "Errore di lettura da client %s", ip);
perror(buffer);
free((void*)buffer);
exit(-1);
}
//conterrà il comando da eseguire
char command = request(buffer);
//solo per il debugging
printf("Letto %d\n", command);
if(write(sock_ds, &command, sizeof(char)) == -1){
bzero(buffer, MAX_BUFFER);
sprintf(buffer, "Errore invio messaggio a %s", ip);
perror(buffer);
free((void*)buffer);
exit(-1);
}
Processo client
bzero(buffer, MAX_BUFFER);
printf("Inserisci richiesta: ");
fgets(buffer, MAX_BUFFER, stdin);
if(write(sock_ds, buffer, strlen(buffer)) == -1){
perror("Errore invio richiesta al server");
free((char*)buffer);
return FAIL;
}
if(read(sock_ds, &t, sizeof(char)) == -1){
perror("Errore lettura da server");
free((char*)buffer);
return FAIL;
}
printf("Ho letto %d\n", t);

funziona così
1)client inserisce un comando
2)lo invia al server
3)il server controlla e l'intero che ritorna è salvato nella variabile command (un char, il cui valore lo controllo subito visivamente con la printf e li non ci sono problemi)
4)lo invio al client
5)il client recepisce valori strani

Mi sono perso qualcosa per strada?

Teo@Unix
13-06-2010, 13:02
printf("Ho letto %d\n", t);


Come mai usi il formato integer per stampare un carattere? request non può ritornare un int se si tratta di un numero?

Cmq potrebbe essere che l'errore risiede in un'altra parte di codice... che ti stampa il client? E cosa invece ti aspetti di vedere?

clockover
13-06-2010, 13:07
La funzione mi ritorna degli interi

int request(char *req){
//ignoro \n finale
int len = strlen(req) - 1;
if(strncmp(req, "list", len) == 0)
return LIST;
if(strncmp(req, "insert", len) == 0)
return INSERT;
if(strncmp(req, "help", len) == 0)
return HELP;
if(strncmp(req, "find", len) == 0)
return FIND;
if(strncmp(req, "quit", len) == 0)
return QUIT;

return NOT_REC;
}

Ovviamente il client mi deve stampare il carattere inviato dal server sotto forma di intero! Adesso sto apportando alcune modiche per fare altre prove!
Diciamo che comunque a prima vista non dovrebbero esserci errori, cosa ne dici? Gli spezzoni che ho inviato sono quelli che prendono parte alle operazioni, quindi non può dar fastidio nient'altro! E comunque il server invia giusto il valore!
A dimenticavo, mi stampa caratteri con codice del tipo 108, ecc.. adesso mi studio bene anche l'errore..

Teo@Unix
13-06-2010, 13:17
Diciamo che comunque a prima vista non dovrebbero esserci errori, cosa ne dici? Gli spezzoni che ho inviato sono quelli che prendono parte alle operazioni, quindi non può dar fastidio nient'altro! E comunque il server invia giusto il valore!
A dimenticavo, mi stampa caratteri con codice del tipo 108, ecc.. adesso mi studio bene anche l'errore..

No infatti sembra corretto,
per 108 intendi il valore di errno?
Strano perchè sarebbe:
81 #define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */

Comunque dovresti risolvere debuggando. Ad esempio prova a verificare il contento delle variabili durante l'esecuzione del codice che hai postato.

clockover
13-06-2010, 13:26
No no ferma tutto.... che pippone madornale che sono... almeno adesso che ho finito di mangiare risolvo il tutto.... in pratica era come dicevi tu... c'erano altre parti del codice che io (come un ebbete) ho dimenticato di commentare per fare le prove! Dopo che il server inviava il responso positivo, per un determinato comando c'era una write che scriveva tot bytes! Ma siccome il client leggeva un byte la volta, mi stampava 108, che in ascii è il primo carattere del buffer inviato dal server... che svista madornale!

Teo@Unix
13-06-2010, 13:29
No no ferma tutto.... che pippone madornale che sono... almeno adesso che ho finito di mangiare risolvo il tutto.... in pratica era come dicevi tu... c'erano altre parti del codice che io (come un ebbete) ho dimenticato di commentare per fare le prove! Dopo che il server inviava il responso positivo, per un determinato comando c'era una write che scriveva tot bytes! Ma siccome il client leggeva un byte la volta, mi stampava 108, che in ascii è il primo carattere del buffer inviato dal server... che svista madornale!

e vabbò ... a me succede spesso... :D

clockover
13-06-2010, 13:34
e vabbò ... a me succede spesso... :D


si ma il peggio è che è da ieri sera che sto smadonnando.....