我一直想知道何时触发了提供BeginRecieve呼叫的回叫。
我发现了一个类似的问题,我将重复这个问题,因为我不能说得更清楚:
现在所有文档都说回调,如中所述 BeginReceive,一旦“收到数据”就被调用。但这是 相当模糊:如果你不知道怎么回事的那一刻 究竟是其他进程提供数据?
一个标准是BeginReceive()被认为已经完成(因此 当状态对象中的缓冲区被填满时,调用callbask 到指定的buffersize。但是,如果“交付”过程是什么呢? 以不规则的方式提供未知数据的数据?对于 例如,如果它首先连续递送100个字节,然后在那里 是一个1毫秒的时间间隔和另外200个字节:确实如此 BeginReceive完成100个字节的传入数据?还是300?
http://www.pcreview.co.uk/forums/exactly-beginreceive-socket-considered-completed-t2899270.html
答案 0 :(得分:0)
假设您的套接字是TCP套接字。然后在任何数据可用时触发回调,但它在回调中最大程度地提供缓冲区大小。无论如何你需要一个成帧协议(意味着你需要多次调用BeginReceive(..)并检测和组合你发送的帧。)
答案 1 :(得分:0)
我的经验是,要求任何数据可以立即使用。这意味着读取可能相当小,如1400字节左右,因为它大约是MTU大小。
读取可以是其倍数,因为如果数据包按顺序到达,则在逻辑上第一个到达时,应用程序可以看到所有数据包都可见。在这种情况下,您可以一次性读取所有连续排队的数据包。
我猜你的读取大小会因极快的连接而增加,因为你的应用程序可能无法像网络传送单个数据包一样快地将字节出列。
旁注:在接收返回的同一时刻调用BeginReceive-callback。您无法以这种方式减少延迟。 (延迟实际上会增加很小的数量,因为异步操作可能比阻塞操作具有更高的开销)。