虽然我已经阅读了很多关于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
会收到通知吗?
提前致谢。
答案 0 :(得分:2)
如果任何启动重叠操作的套接字API调用将在完成时生成I / O完成端口的完成,则返回0,然后生成完成IS并将其发布到IOCP。有关详细信息,请参阅this Microsoft knowledge base article。因此,对于非错误返回情况,您无需特殊处理。
...除
如果您使用SetFileCompletionNotificationMode()设置FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
模式。在这种情况下,返回值0不会导致正常的完成处理,并且您需要在API调用成功后进行完成处理。