Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TCP WSASend完成标准_C++_Sockets_Network Programming_Winsock - Fatal编程技术网

C++ TCP WSASend完成标准

C++ TCP WSASend完成标准,c++,sockets,network-programming,winsock,C++,Sockets,Network Programming,Winsock,我找不到TCP WSASend调用完成意味着什么的规范。WSASend操作的完成是否需要接收ACK响应 这个问题与具有200ms-2s ping超时的较慢网络相关。调用WSASend完成回调(或使用任何完成机制)需要200毫秒-2秒吗?或者仅仅在一些数据包上,Windows会等待一个ACK,并且认为WSAASEN操作对于所有其他数据包都快得多? 确切的行为在缓冲区生命周期管理方面有很大的不同,反过来又对性能(锁定、分配/释放和引用计数)有很大的影响。没有记录。这可能会有所不同,具体取决于您是否已

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

这个问题与具有200ms-2s ping超时的较慢网络相关。调用WSASend完成回调(或使用任何完成机制)需要200毫秒-2秒吗?或者仅仅在一些数据包上,Windows会等待一个ACK,并且认为WSAASEN操作对于所有其他数据包都快得多?


确切的行为在缓冲区生命周期管理方面有很大的不同,反过来又对性能(锁定、分配/释放和引用计数)有很大的影响。

没有记录。这可能会有所不同,具体取决于您是否已关闭发送缓冲。但是,您始终需要注意完成所需的潜在时间,特别是在使用异步调用时。有关详细信息,请参阅


当TCP堆栈使用缓冲区完成时,您将获得一个
WSASend()
完成。如果您没有通过将
SO_SNDBUF
设置为零来关闭发送缓冲,则这可能意味着您将在堆栈将数据复制到其缓冲区后完成发送。如果您已经关闭了发送缓冲,那么这可能意味着您将在获得ACK后获得一个完成(只是因为堆栈应该需要您的缓冲来进行任何可能的重新传输)。但是,它没有文档记录。

WSASend不保证以下内容:

  • 数据已发送(可能已缓冲)
  • 已收到(可能已丢失)
  • 接收应用程序对其进行了处理(发送方原则上永远不会知道这一点)
  • 它不需要往返。事实上,在启用唠叨的情况下,少量数据总是被缓冲200毫秒,希望应用程序能够发送更多数据。WSASend必须尽快返回,以便唠叨有机会工作

    如果您需要确认,请更改应用程序协议,以便重新获得确认。没有别的办法


    要澄清的是,即使没有唠叨(TCP_NODELAY),您也不会收到发送操作的ACK。它将被发送到网络,但远程端不知道它应该确认。TCP无法说“请立即确认此数据”。发送的数据并不意味着将永远收到。数据被推送到黑洞后,网络可能会在一秒钟内中断。

    你认为
    TCP\u NODELAY
    会有所不同吗?这可能意味着数据发送速度会略微加快,因此可能会略微缩短完成时间。