【问题标题】:Why does my send callback execute so quickly after calling Socket.BeginSend?为什么调用 Socket.BeginSend 后我的 send 回调执行得这么快?
【发布时间】: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 方法意味着底层系统已经有空间来缓冲您的数据以进行网络发送。”

标签: c# sockets tcp


【解决方案1】:

是的,操作系统会缓冲数据(尽管 1MB 似乎很多)。发送永远不会向您保证远程端已收到数据。即使没有操作系统缓冲也是如此。要么让对方确认数据,要么Shutdown套接字并等待连接完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2012-04-04
    • 2020-02-25
    相关资源
    最近更新 更多