PDA

View Full Version : Ancora read e write su socket in C


Cimmo
17-02-2003, 16:39
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:


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);
};


chi riceve invece ha:

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);
}

cionci
17-02-2003, 16:51
Io direi prima di tutto di cambiare i cicli di lettura in questo modo :

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)

Ora prova anche se non credo che sia quello l'errore...
Ah anche durante la lettura del messaggio devi emttere header-nread...

Cimmo
17-02-2003, 17:00
Originally posted by "cionci"

Io direi prima di tutto di cambiare i cicli di lettura in questo modo :

do
{
...

} while(nwrite == HEADERSIZE)

Ora prova anche se non credo che sia quello l'errore...
Ah anche durante la lettura del messaggio devi emttere header-nread...
Beh se metto il do while devo mettere != e non ==
Inoltre anche if ((n=read(socketfd, &header, HEADERSIZE))<0) devo mettere (HEADERSIZE-nread) ?
In ogni caso non funzia...

Cimmo
17-02-2003, 17:10
Ho modificato il post iniziale con le nuove funzioni...HELP ME! :muro:

cionci
17-02-2003, 17:40
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...

Cimmo
17-02-2003, 17:50
Originally posted by "cionci"

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...
Ok fatta la modifica del while!
Odio quando non riesco a capire il perche' delle cose :mad: -> :muro: -> :cry:

Cimmo
17-02-2003, 21:25
Eh eh eh...ilsensine ne sa una in piu' del diavolo...o forse sono io che non ne so ancora abbastanza? :cry:
Beh l'importante e' aver messo a posto il tutto :cool:

cionci
18-02-2003, 07:33
Ehm...dov'è il post di ilsensine ? Dov'era il problema...

Cimmo
18-02-2003, 09:26
Originally posted by "cionci"

Ehm...dov'è il post di ilsensine ? Dov'era il problema...
Diciamo che l'ho impezzato da un'altra parte :)
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?

cionci
18-02-2003, 11:25
Ecco perchè non andava !!!!