[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