C++ TCP WSASend完成标准
我找不到TCP WSASend调用完成意味着什么的规范。WSASend操作的完成是否需要接收ACK响应 这个问题与具有200ms-2s ping超时的较慢网络相关。调用WSASend完成回调(或使用任何完成机制)需要200毫秒-2秒吗?或者仅仅在一些数据包上,Windows会等待一个ACK,并且认为WSAASEN操作对于所有其他数据包都快得多?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()
完成。如果您没有通过将SO_SNDBUF
设置为零来关闭发送缓冲,则这可能意味着您将在堆栈将数据复制到其缓冲区后完成发送。如果您已经关闭了发送缓冲,那么这可能意味着您将在获得ACK后获得一个完成(只是因为堆栈应该需要您的缓冲来进行任何可能的重新传输)。但是,它没有文档记录。WSASend不保证以下内容:
要澄清的是,即使没有唠叨(TCP_NODELAY),您也不会收到发送操作的ACK。它将被发送到网络,但远程端不知道它应该确认。TCP无法说“请立即确认此数据”。发送的数据并不意味着将永远收到。数据被推送到黑洞后,网络可能会在一秒钟内中断。你认为
TCP\u NODELAY
会有所不同吗?这可能意味着数据发送速度会略微加快,因此可能会略微缩短完成时间。