From: Philip Thompson
> On Aug 26, 2009, at 11:56 AM, Bob McConnell wrote:
>> From: Philip Thompson
>>>
>>> During a socket read, why would all the requested number of bytes
not
>>> get sent? For example, I request 1000 bytes:
>>>
>>> <?php
>>> $data = @socket_read ($socket, 2048, PHP_BINARY_READ);
>>> ?>
>>>
>>> This is actually in a loop, so I can get all the data if split up.
>>> So,
>>> for example, here's how the data split up in 3 iterations (for 1000
>>> bytes):
>>>
>>> 650 bytes
>>> 200 bytes
>>> 150 bytes
>>>
>>> But if I can accept up to 2048 bytes per socket read, why would it
>>> not
>>> pull all 1000 bytes initially in 1 step? Any thoughts on this would
>>> be
>>> greatly appreciated!
>>
>> Because that's the way TCP/IP works, by design. TCP is a stream
>> protocol. It guarantees all of the bytes written to one end of the
>> pipe
>> will come out the other end in the same order, but not necessarily in
>> the same groupings. There are a number of buffers along the way that
>> might split them up, as well as limits on packet sizes in the various
>> networks it passed through. So you get what is available in the last
>> buffer when a timer expires, no more, and no less.
>>
>> If you have serialized data that needs to be grouped in specific
>> blocks,
>> your application will need to keep track of those blocks,
reassembling
>> or splitting the streamed data as necessary. You could use UDP which
>> does guarantee that packets will be kept together, but that protocol
>> doesn't guarantee delivery.
>
> Thank you for your input.
>
> Is it guaranteed that at least 1 byte will be sent each time? For
> example, if I know the data length...
>
> <?php
> $input = '';
>
> for ($i=0; $i<$dataLength; $i++) {
> // Read 1 byte at a time
> if (($data = @socket_read ($socket, 1, PHP_BINARY_READ)) !==
> false) {
> $input .= $data;
> }
> }
>
> return $input;
> ?>
>
> Or is this a completely unreasonable and unnecessary way to get the
> data?
While I have written a lot of code to manage sockets over the years, and
coded a UDP/IP stack, I have never done it in PHP. And unfortunately, I
don't have time to experiment right now. My boss is waiting for the next
product release from me.
Getting one byte at a time is somewhat wasteful, as it requires more
system calls than necessary. That's a lot of wasted overhead.
Whether you always get one or more bytes depends on a number of factors,
including whether the calls PHP uses are blocking or non-blocking, plus
there may be ways to switch the socket back and forth.
Have you tried doing a Google search on the group of PHP functions you
expect to use. That should come up with some sample code to look at.
Bob McConnell
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php