[LUGOS-PROG] Tezave s komunikacijo prek TCP/IP
Ales Bardorfer
alesb at robo.fe.uni-lj.si
Mon Sep 10 12:03:37 CEST 2001
Iztok Sitar wrote:
> Naletel sem namrec na situacijo, ko na klientu preberem
> manj podatkov kot sem jih zapisal na serverju. Ostanek paketa dobim na
> zacetku naslednjega paketa, ki ga je poslal server.
To je normalno. Za to obstaja precej dokumentacje, recimo tudi ta:
<http://www.ecst.csuchico.edu/~beej/guide/net/html/syscalls.html#sendrecv>
Resitev je da to detektiras (write() in read() vrneta mnaj kot to
zahtevas) in "preostanek" ponovno posljes.
Uporabi nekaj v tem smislu:
int block_write (int outfile, const char buffer[], int length)
{
register int sofar; /* How many characters sent so
far */
register int ret; /* Return value from write() */
sofar = 0;
do {
/* Try to write the remaining data */
ret = write(outfile, buffer+sofar, length-sofar);
sofar += ret;
/* Ignore interrupted system calls - retry */
if ( (ret == -1) && (errno == EINTR) ) {
ret = 1; /* So we go around the loop again */
sofar += 1; /* Restoring it from above -1 */
}
} while ( (ret > 0) && (sofar < length) );
if (ret == -1) return(-1); /* Error during write */
if (ret == 0) return(0); /* EOF reached */
return(sofar); /* All bytes written */
}
int block_read(int infile, char buffer[], int length)
{
register int sofar; /* How many we read so far */
register int ret; /* Return value from the read()
*/
if (!length) {
return 0;
}
sofar = 0;
do {
/* Try to read all remaining data */
ret = read(infile, buffer+sofar, length-sofar);
sofar += ret;
/* Ignore interrupted system calls - retry */
if ( (ret == -1) && (errno == EINTR) ) {
ret = 1; /* So we go around the loop again */
sofar += 1; /* Restoring it from above -1 */
}
} while ((ret > 0) && (sofar < length));
if (ret == -1) return(-1); /* Error during read */
if (ret == 0) return(0); /* EOF reached */
return(sofar); /* All bytes read */
}
lp,
Ales
--
/*****************************************************************
* *
* Ales Bardorfer, univ.dipl.ing.el *
* Laboratory of Biomedical Engineering and Robotics *
* Faculty of Electrical Engineering tel.: +386 1 4768 484 *
* Trzaska 25, SI-1000 Ljubljana, Slovenia fax.: +386 1 4768 239 *
* http://robo.fe.uni-lj.si/staff-11.html *
* mailto:alesb at robo.fe.uni-lj.si *
* *
*****************************************************************/
More information about the lugos-prog
mailing list