1

我一直想知道什么时候触发了 BeginRecieve 调用提供的回调。

  • 是在它接收到缓冲区可以容纳的数据时吗?如果是这样 - 如果数据小于缓冲区怎么办)
  • 是它收到一个 TCP/IP 数据包的时候吗?
  • 是别的吗?

我发现了一个类似的问题,我将重复一遍,因为我不能说得更清楚:

现在所有文档都说,一旦“接收到数据”,就会调用 BeginReceive 中指定的回调。但这相当模糊:如果您不知道其他进程如何准确地提供数据,那么那个时刻究竟是什么时候?

一个标准是当状态对象中的缓冲区被填充到指定的缓冲区大小时,认为 BeginReceive() 已完成(因此调用了 callbask)。但是,如果“交付”过程以未知数量和不规则模式提供数据怎么办?例如,如果它首先连续发送 100 个字节,然后有 1 毫秒的时间间隔,然后是另外 200 个字节:BeginReceive 是否完成了 100 个字节的传入数据?还是300?

http://www.pcreview.co.uk/forums/exactly-beginreceive-socket-considered-completed-t2899270.html

4

2 回答 2

0

假设您的套接字是 TCP 套接字。然后当任何数据可用时触发回调,但它在回调中传递的最大值与缓冲区大小一样多。无论如何,您都需要一个成帧协议(意味着您需要多次调用 BeginReceive(..) 并检测和组装您发送的帧)。

于 2012-06-14T10:14:17.940 回答
0

我的经验是,任何数据都需要立即可用。这意味着读取可以相当小,例如 1400 字节左右,因为它是 MTU 大小的数量级。

读取可以是它的倍数,因为如果数据包无序到达,则在逻辑上第一个到达的那一刻,所有这些都对应用程序可见。在这种情况下,您可以一次读取所有连续排队的数据包。

我猜你的读取大小会在极快的连接上增加,因为你的应用程序可能无法像网络传递单个数据包一样快地出列字节。

旁注:BeginReceive-callback 在 Receive 返回的同时被调用。你不能以这种方式减少延迟。(延迟实际上会增加一点点,因为异步操作可能比阻塞操作具有更高的开销)。

于 2012-06-14T10:24:34.960 回答