PC Review


Reply
Thread Tools Rate Thread

When exactly is BeginReceive on a socket considered completed?

 
 
Marcel Brekelmans
Guest
Posts: n/a
 
      30th Aug 2006
Hi,

I use a socket to receive data from a certain process. I use the
asynchronous operations BeginReceive() and EndReceive(), with a callback in
BeginReceive. Now all documentation says that the callback, as specified in
BeginReceive, is called as soon as 'the data is received'. But this is
rather vague: when exactly is that moment if you don't know how exactly that
other process is providing data?

One criterium is that BeginReceive() is considered completed (and thus the
callbask is called) when the buffer in the state object is filled upto the
specified buffersize. But what if the 'delivering' process is feeding data
in unknown quantities and in an irregular pattern? For instance, if it first
delivers 100 bytes consecutively, and then there is a time interval of 1
millisecond and another 200 bytes follow: does BeginReceive complete with
100 bytes of incoming data? Or 300?

Thanks for any insight.

Marcel Brekelmans


 
Reply With Quote
 
 
 
 
Mike Blake-Knox
Guest
Posts: n/a
 
      1st Sep 2006
In article <(E-Mail Removed)>, Marcel Brekelmans
wrote:
> But what if the 'delivering' process is feeding data
> in unknown quantities and in an irregular pattern?


Data arrives in packets that are split based on how much data the
sending process supplies at a time but that may also be split while
they're in transit. As far as the receiving application is concerned,
the receive completes when a LAN packet is received. If there's more
data, that is handled on the next receive.

If you're using TCP, the protocol is designed to handle a logically
continuous stream of octets/bytes without marked message start/finish.
It's important to understand that packets may be arbitrarily split
while in transit (or for that matter, by one of the end point hosts).
Applications typically split data into messages by including either a
message length or an end of message flag.

Hope this helps.

Mike

 
Reply With Quote
 
 
 
 
William Stacey [MVP]
Guest
Posts: n/a
 
      1st Sep 2006
As Mike points out, you can't count on anything. You can only count on 1
byte or 0 (i.e. closed). You need to "know" how many to expect and loop. I
find the best way to do this is by prepending a length (or fixed length
header that includes the data length) to the message, so then you know when
the message is received. Appending a marker at the end can be problematic
as you need to pick a marker that will never appear in the data stream.
With a prepended Len, you don't need to worry about it.

--
William Stacey [MVP]

"Marcel Brekelmans" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
| Hi,
|
| I use a socket to receive data from a certain process. I use the
| asynchronous operations BeginReceive() and EndReceive(), with a callback
in
| BeginReceive. Now all documentation says that the callback, as specified
in
| BeginReceive, is called as soon as 'the data is received'. But this is
| rather vague: when exactly is that moment if you don't know how exactly
that
| other process is providing data?
|
| One criterium is that BeginReceive() is considered completed (and thus the
| callbask is called) when the buffer in the state object is filled upto the
| specified buffersize. But what if the 'delivering' process is feeding data
| in unknown quantities and in an irregular pattern? For instance, if it
first
| delivers 100 bytes consecutively, and then there is a time interval of 1
| millisecond and another 200 bytes follow: does BeginReceive complete with
| 100 bytes of incoming data? Or 300?
|
| Thanks for any insight.
|
| Marcel Brekelmans
|
|


 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Socket.BeginReceive/Socket.EndReceive Documentation Problem Cool Guy Microsoft Dot NET Framework 5 11th Jun 2005 11:19 PM
Socket.BeginReceive Question Mike Hildner Microsoft Dot NET Framework 2 10th Oct 2003 03:30 PM
Socket.BeginReceive() TP-Software Microsoft Dot NET 3 11th Sep 2003 11:10 AM
Async Socket.BeginReceive triggers SocketException 10054: "An existing connection was forcibly closed by the remote host" Peter Vrenken Microsoft Dot NET Framework 0 7th Sep 2003 07:27 PM
Async Socket , BeginReceive question . dream machine Microsoft C# .NET 2 29th Jul 2003 04:04 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 01:14 PM.