TCP issue with large packet under RTEMS

Yann Sionneau yann at minet.net
Wed Feb 9 17:26:21 UTC 2011


Hi Joao,

The fact that recv() can return before receiving everything you expect, 
and is non-blocking, is the standard way of functionning for recv().

This is the POSIX way, if you do man recv on a Linux system for example 
you will see that this behaviour is documented.

This is the correct behaviour of recv(), you have to run it inside a 
loop if you want to be sure to receive all the data you need.

On Linux there is a flag MSG_WAITALL that you can pass to recv() to make 
it wait untill it receives the amount of data you tell him to get. I 
don't know if it is implemented in RTEMS TCP/IP protocol stack.

Regards,

Yann Sionneau

Le 09/02/11 17:10, João Rasta a écrit :
> Hi Joel, Eric,
>
> I followed Eric's suggestion and it worked. I thought that read() should
> be automatically blocking untill all numelements passed to the read()
> function were read. I wonder why read() exits without this condition to
> fulfill..
>
> Joel, how can i increase the TCP/IP stack size in order to get more
> performance out of the read routine? I mean, using only one system call
> to get the whole data would be perfect. Previously the application did
> not lock, it simply returned the read with less bytes than the buffer
> size and continued executing.
>
>
> Thanks a lot.
>
> Best,
> JM
>
> On Wed, Feb 9, 2011 at 4:55 PM, Eric Norum <wenorum at lbl.gov
> <mailto:wenorum at lbl.gov>> wrote:
>
>     TCP (SOCK_STREAM) receivers always need to expect to have to
>     complete their reads in multiple operations -- you need to put your
>     read call in a loop:
>
>             char *buf;
>             ssize_t nleft, nread;
>             .
>             .
>             .
>             buf = .....
>             nleft = .....
>             while (nleft) {
>                     nread = read(sd, buf, nleft);
>                     if (nread < 0)
>                             error......
>                     if (nread == 0)
>                             end-of-file......
>                     buf += nread;
>                     nleft -= nread;
>             }
>
>     On Feb 9, 2011, at 8:36 AM, João Rasta wrote:
>
>      > Hi,
>      >
>      > I'm using RTEMS 4.10 and GRETH MAC in order to exchange data with
>     a client PC via TCP. I have a LEON-3 based processor architecture. I
>     can successfully attach the GRETH ethernet driver using the RTEMS
>     driver manager and exchange small ammounts of data. However, when i
>     need to transfer an image array (436160Bytes) from the PC to the
>     RTEMS system, the read() call only returns 17508Bytes read instead
>     of 436160Bytes .
>      >
>      > The send() directive in the PC side returns the correct number of
>     bytes sent so the problem must be on the RTEMS side. The read buffer
>     has the correct size.
>      >
>      > 1) Is there any programmable limitation related to the number of
>     bytes to receive? Since i'm using a TCP socket, there is no apparent
>     reason for byte loss i guess..
>      >
>      > 2) In what circumstances should read() from a TCP socket return
>     less bytes than the ones sent?
>      >
>      >
>      > Best,
>      > JM
>      >
>
>     --
>     Eric Norum
>     wenorum at lbl.gov <mailto:wenorum at lbl.gov>



More information about the users mailing list