|
|||||||
|
|
|
![]() |
|
|
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: 12:15.



















