|
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 mailing list archive is Copyright 1997-2025 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.