c++ - TCP WSASend 完成标准

标签 c++ sockets network-programming winsock

我无法找到 TCP WSASend 调用完成意味着什么的规范。 WSASend 操作的完成是否需要收到 ACK 响应?

此问题与 200 毫秒 - 2 秒 ping 超时的较慢网络相关。调用 WSASend 完成回调(或使用任何完成机制)是否需要 200 毫秒 - 2 秒?或者也许只有某些数据包 Windows 才会等待 ACK,并认为 WSASend 操作对于所有其他数据包来说完成得更快?

确切的行为对缓冲区生命周期管理有很大影响,进而对性能(锁定、分配/释放和引用计数)产生重大影响。

最佳答案

WSASend 不保证以下内容:

  1. 数据已发送(可能已被缓冲)
  2. 已收到(可能已丢失)
  3. 接收应用程序处理了它(原则上发送者永远无法知道这一点)

不需要往返。事实上,启用 nagling 后,少量数据总是会缓冲 200 毫秒,希望应用程序能够发送更多数据。 WSASend必须快速返回,以便 nagling 有机会发挥作用。

如果您需要确认,请更改应用程序协议(protocol),以便您收到确认信息。没有其他办法可以做到这一点。

澄清一下,即使没有 nagling (TCP_NODELAY),您也不会收到发送操作的 ACK。它将被发送到网络,但远程端不知道它应该 ACK。 TCP 没有办法说“请立即确认此数据”。数据被发送并不意味着它会被接收。数据被插入黑洞后,网络可能会掉线一秒钟。

关于c++ - TCP WSASend 完成标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21093128/

相关文章:

ios - BSD 套接字在 iPhone 3G 环境中不起作用

c++ - 在 C++ 中,你有像 C# 中那样的 'out parameters' 吗?

c++ - 具有缩放拉伸(stretch)纵横比的 glm 旋转

c# - 套接字只接收部分消息 C#

java - 允许应用程序使用网络发送或接收数据?

java - Socket TCP 通信数据包拆分

c++ - Boost graphviz自定义顶点标签

c++ - 能否在 MFC 按钮控件上检测到鼠标右键单击事件?

sockets - 如何检索 boost asio 套接字文件描述符

c++ - 客户端未收到 UDP 连接响应