× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.


  • Subject: Re: Memory allocation
  • From: Scott Klement <klemscot@xxxxxxxxxxxx>
  • Date: Tue, 24 Jul 2001 15:57:53 -0500 (CDT)



On Tue, 24 Jul 2001 PatrickConner@parkdalemills.com wrote:

> 
> This is the reason for my original question. I'm reading an XML document
> which varies in size per transaction. Many times it runs up to 200K. I
> have my read set to recieve 32K per read. However, the first read
> receives 108 bytes and most of the time the next reads will receive
> 16,832 bytes. 

Yes, but that has nothing to do with the question that you asked.  You
asked "When reading a socket what determines the maximum size of data 
from a single read operation?".   The MAXIMUM amount is the number you
supply in the 3rd parameter.  

Since you didn't provide ANY other detail in your question, I could only
assume that you meant exactly what you asked.

> My sockets program is communicating with a web-server from
> a Windows box (if that helps). 

Doesn't matter what system it's coming from.

> Also, the 16,832 thing is not consistent.
> For an example: I received a document that took four reads that arrived
> in the following sequence. First read: 108; Second read: 16,832; Third
> read: 16,832; Fourth read: 8,586. I then received the exact same document
> again and it arrived as 108; 21,152; 16,832; 4,266. It seems to me that
> the iSeries is buffering the input somewhere.

Yes, it is buffered.  Remember that your system is switching between many
different tasks, and doing many different things.   Any data that it
didn't buffer would be lost, since the system wouldn't be reading data
coming into the network card 100% of the time.  

It's not expected to be consistent.   The read() or recv() API will input
as much data as is available in the system's buffer for that socket.  
With a blocking socket, the amount you read will always be at least one
byte (unless an error occurs) and will always be less than the maximum
amount, (the amount that you specified on the 3rd parm)

IF you want to read the data in fixed-size chunks (which doesn't seem like
a very good idea for an XML document) you should use a loop.  Something
like this should work:

     D p_buf           S               *
     D buflen          S             10I 0
     D buffer          S          32766A
     D spaceleft       S             10I 0
     D rc              S             10I 0

     c                   eval      buflen = 0

     c                   dou       buflen = %size(buffer)
     c                   eval      spaceleft = %size(buffer) - buflen
     c                   eval      p_buf = %addr(buffer) + buflen
     c                   eval      rc = recv(sock: p_buf: spaceleft: 0)
     c                   if        rc < 0
     C* handle an error
     c                   endif
     c                   eval      buflen = buflen + rc
     c                   enddo


+---
| This is the RPG/400 Mailing List!
| To submit a new message, send your mail to RPG400-L@midrange.com.
| To subscribe to this list send email to RPG400-L-SUB@midrange.com.
| To unsubscribe from this list send email to RPG400-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.