【发布时间】:2013-08-31 00:50:40
【问题描述】:
当我向远程机器发送大量数据时,发送回调几乎立即执行。
[05:10:35:981] ChildSocket.Send(): Sending 1048508 bytes.
[05:10:35:988] ChildSocket.SendCallback(): Sent 1048508 bytes.
我的互联网速度不可能在 7 毫秒内成功发送近 1 兆字节。
由于这种行为,我的印象是调用 BeginSend 只是将发送缓冲区写入操作系统,操作系统会在适当的时候发送它。
这种怀疑正确吗?为什么发送回调执行得这么快?
【问题讨论】:
-
请记住,您的互联网与发送所需的时间无关,而与到达所需的时间无关。一旦您的数据在网络上,它就会被发送。
-
Socket.BeginSend 的文档确实说:“成功完成发送并不表示数据已成功传递。如果传输系统中没有可用的缓冲区空间来保存要发送的数据传输时,发送将阻塞,除非套接字已置于非阻塞模式。”
Socket.Send的文档也说了同样的话。它还说:成功完成 Send 方法意味着底层系统已经有空间来缓冲您的数据以进行网络发送。”