繁体   English   中英

.NET Socket.BeginReceive:何时触发回调

[英].NET Socket.BeginReceive: When is callback triggered

我一直想知道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

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

我的经验是,它要求任何可用的数据都不会延迟。 这意味着读取可能非常小,例如1400字节左右,因为这大约是MTU大小。

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

我猜您的读取大小将在非常快速的连接上增加,因为您的应用程序可能无法像网络传递单个数据包一样快地使字节出队。

旁注:BeginReceive-callback会在Receive即将返回的同一时刻被调用。 您不会以这种方式减少延迟。 (由于异步操作的开销可能比阻塞操作的开销大,因此延迟实际上会增加一点点)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM