GQCS 收到通知,当 WSAsend 返回 0 时?

Posted

技术标签:

【中文标题】GQCS 收到通知,当 WSAsend 返回 0 时?【英文标题】:GQCS gets notification, when WSAsend returns 0? 【发布时间】:2014-01-12 13:22:16 【问题描述】:

虽然我已经阅读了很多关于 WSAsend (msdn) 的内容,但我仍然需要一些说明。

我的部分代码:

   int rc;
   rc=WSASend(Socket,....);

   if (rc==0) ....
   else if ((rc == SOCKET_ERROR) && (WSA_IO_PENDING != (err = WSAGetLastError()))) 
          
           printf("WSASend failed with error: %d Socket(%d) \n", err,(pTmp1->Socket));
           ....
          

msdn 中说 WSAsend 操作有时可能会立即完成返回零(在我的测试服务器期间从未发生过)。那么如果发生这种情况,GetQueuedCompletionStatus 会收到通知吗?

提前致谢。

【问题讨论】:

【参考方案1】:

如果任何发起重叠操作的套接字 API 调用将在完成时生成对 I/O 完成端口的完成返回 0,则生成完成并将其发布到 IOCP。有关详细信息,请参阅this Microsoft knowledge base article。因此,您不需要对非错误返回情况进行特殊处理。

除了...

如果您使用SetFileCompletionNotificationMode() 来设置FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 模式。在这种情况下,返回值 0 不会导致正常的完成处理,您需要在 API 调用成功后进行完成处理。

【讨论】:

以上是关于GQCS 收到通知,当 WSAsend 返回 0 时?的主要内容,如果未能解决你的问题,请参考以下文章

我可以反复调用 WSASend() 吗?

在迂回的 WSASend 中阻塞数据包

IOCP 服务器并使用单个 wsasend 发送数据

阻塞模式下的 WSASend() 是不是会导致将通知数据包放置在完成端口中?

如何确保 WSASend() 将发送数据?

是否有可能不会收到 WSASend 调用的完成?