|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Ancora read e write su socket in C
Sto di nuovo sotto il mio programmozzo...devo spedire da A a B un pacchetto, ho deciso di spedire prima una sorta di header che dice quanto e' lungo il pacchetto che poi spedisco dopo l'header. Ho fatto 2 funzioni, ma non so perche' l'header arriva, ma poi quando deve ricevere il pacchetto chi spedisce si ferma in un: write() failed [err 104]: Connection reset by peer mentre chi riceve piglia sto errore: read() failed [err 14]: Bad address
i 2 codici sono questi prima chi spedisce: Codice:
int sendData(int socketfd, char msg[MAXSIZE]) { long nwrite, len, n; /* scrittura */ len=strlen(msg); nwrite=0; do { if ((n=write(socketfd, &len, (HEADERSIZE-nwrite)))<0) { if (errno!=EINTR) { char msgerror[1024]; sprintf(msgerror,"write() failed [err %d]",errno); perror(msgerror); fflush(stderr); return(1); } } else nwrite+=n; } while (nwrite<HEADERSIZE); nwrite=0; while ((len-nwrite)>0) { if ((n=write(socketfd, &(msg[nwrite]), (len-nwrite)))<0) { if (errno!=EINTR) { char msgerror[1024]; sprintf(msgerror,"write() failed [err %d]",errno); perror(msgerror); fflush(stderr); return(1); } } else nwrite+=n; } return(0); }; Codice:
int receiveHeaderAndData(int socketfd, char *msg) { long n,nread,header; nread=0; do { if ((n=read(socketfd, &header, (HEADERSIZE-nread)))<0) { if (errno!=EINTR) { char msgerror[1024]; sprintf(msgerror,"read() failed [err %d]",errno); perror(msgerror); fflush(stderr); return(1); } } else nread+=n; } while (nread<HEADERSIZE); nread=0; printf("\n\nSocketfd: %d: header: %ld\n\n",socketfd,header); while ((header-nread)>0) { if ((n=read(socketfd, &(msg[nread]), (header-nread)))<0) { if (errno!=EINTR) { char msgerror[1024]; sprintf(msgerror,"read() failed [err %d]",errno); perror(msgerror); fflush(stderr); return(1); } } else nread+=n; } return(0); } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Io direi prima di tutto di cambiare i cicli di lettura in questo modo :
Codice:
do { //Nota il 3o parametro della write if ((n=write(socketfd, &len, HEADERSIZE-nwrite))<0) { if (errno!=EINTR) { char msgerror[1024]; sprintf(msgerror,"write() failed [err %d]",errno); perror(msgerror); fflush(stderr); return(1); } } else nwrite+=n; } while(nwrite == HEADERSIZE) Ah anche durante la lettura del messaggio devi emttere header-nread... |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
Inoltre anche if ((n=read(socketfd, &header, HEADERSIZE))<0) devo mettere (HEADERSIZE-nread) ? In ogni caso non funzia... |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Ho modificato il post iniziale con le nuove funzioni...HELP ME!
![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Hai ragione su ==. Metti comunque < non != non si testa mai il diverso su un incremento altrimenti in qualche modo (magari per sbaglio) potresti rischiare di andare in ciclo
![]() Riguardo all'errore...boh... Magari me lo guardo meglio... |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
Odio quando non riesco a capire il perche' delle cose ![]() ![]() ![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Eh eh eh...ilsensine ne sa una in piu' del diavolo...o forse sono io che non ne so ancora abbastanza?
![]() Beh l'importante e' aver messo a posto il tutto ![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ehm...dov'è il post di ilsensine ? Dov'era il problema...
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Quote:
![]() Prima di tutto mi ha fatto mettere sizeof(len) e sizeof(header) nei primi 2 while delle funzioni e poi il problema era che il chiamante della funzione read non allocava la stringa cioe' la dichiaravo cosi': char *msg; e invece lui la voleva dichiarata cosi': char msg[MAXSIZE]; Non capisco perche' la prima dichiarazione funziona in certi altri casi, ma questa volta no...ok non e' allocato lo spazio, ma il C non dovrebbe allocarlo quando ci scrivi? |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ecco perchè non andava !!!!
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:58.