ConnectEx与SetFileCompletionNotificationModes可以同步返回吗?

时间:2014-04-10 20:54:10

标签: sockets winapi tcp io iocp

ConnectEx() API的MSDN页面中,SetFileCompletionNotificationModes()没有任何内容,关于设置标记FILE_SKIP_COMPLETION_PORT_ON_SUCCESS是否也适用于ConnectEx()

SetFileCompletionNotificationModes()的MSDN页面明确指出,如果设置了标志FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,那么应该返回ERROR_IO_PENDING的所有(所有?)API可以立即返回,而不会在IOCP循环中排队OVERLAPPED。

所以,我的问题是:这是否真的适用于所有采用OVERLAPPED且返回ERROR_IO_PENDING的API?

在连接套接字之前,我通过调用FILE_SKIP_COMPLETION_PORT_ON_SUCCESS将我的套接字设置为ConnectEx()

我应该期望ConnectEx()立即返回(也就是说,它不会返回ERROR_IO_PENDING,IOCP循环将完全跳过I / O完成,例如,当连接到localhost时)?

即使我在 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS成功完成后设置了ConnectEx() ,(例如我在ConnectEx()的IOCP完成例程中设置了它),如果我断开连接并通过再次调用ConnectEx()重新使用该套接字来建立新连接,就像我在 ConnectEx()之前设置该标志一样,所以出现同样的问题。

1 个答案:

答案 0 :(得分:4)

为什么要关心?假设它不能仅仅意味着你需要为这一个API调用设置一个特殊情况。假设它可能意味着调用ConnectEx()的代码看起来就像调用所有其他重叠API的代码,WSARecv()WSASend()等。还考虑到现有的性质文档你应该假设它可以。因此,编写没有特殊情况的代码是正确的......

我希望在大多数情况下使用真正的网络堆栈时,您不可能从ConnectEx()获得同步返回,但是,如果您要安装某种自定义诊断Winsock提供程序,它只是为您模拟了连接,或者如果有人发明了一个可以非常快速连接的网络层,那么它可能是可能的。

在我看来,你不需要知道这个问题的答案,你只需要编写应该根据文档编写的代码(说明它可以同步完成)以及它的事实&#39 ; s可能是人们希望你写的代码,如果他们查看你调用其他重叠API的任何其他代码的话。