Hi Joel, Eric,<br><br>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..<br>
<br>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.<br>
<br><br>Thanks a lot.<br><br>Best,<br>JM<br><br><div class="gmail_quote">On Wed, Feb 9, 2011 at 4:55 PM, Eric Norum <span dir="ltr"><<a href="mailto:wenorum@lbl.gov">wenorum@lbl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
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:<br>
<br>
        char *buf;<br>
        ssize_t nleft, nread;<br>
        .<br>
        .<br>
        .<br>
        buf = .....<br>
        nleft = .....<br>
        while (nleft) {<br>
                nread = read(sd, buf, nleft);<br>
                if (nread < 0)<br>
                        error......<br>
                if (nread == 0)<br>
                        end-of-file......<br>
                buf += nread;<br>
                nleft -= nread;<br>
<div><div></div><div class="h5">        }<br>
<br>
On Feb 9, 2011, at 8:36 AM, João Rasta wrote:<br>
<br>
> Hi,<br>
><br>
> 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 .<br>

><br>
> 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.<br>
><br>
> 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..<br>
><br>
> 2) In what circumstances should read() from a TCP socket return less bytes than the ones sent?<br>
><br>
><br>
> Best,<br>
> JM<br>
><br>
<br>
</div></div><font color="#888888">--<br>
Eric Norum<br>
<a href="mailto:wenorum@lbl.gov">wenorum@lbl.gov</a><br>
<br>
</font></blockquote></div><br>