在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()
之前设置该标志一样,所以出现同样的问题。
答案 0 :(得分:4)
为什么要关心?假设它不能仅仅意味着你需要为这一个API调用设置一个特殊情况。假设它可能意味着调用ConnectEx()
的代码看起来就像调用所有其他重叠API的代码,WSARecv()
,WSASend()
等。还考虑到现有的性质文档你应该假设它可以。因此,编写没有特殊情况的代码是正确的......
我希望在大多数情况下使用真正的网络堆栈时,您不可能从ConnectEx()
获得同步返回,但是,如果您要安装某种自定义诊断Winsock提供程序,它只是为您模拟了连接,或者如果有人发明了一个可以非常快速连接的网络层,那么它可能是可能的。
在我看来,你不需要知道这个问题的答案,你只需要编写应该根据文档编写的代码(说明它可以同步完成)以及它的事实&#39 ; s可能是人们希望你写的代码,如果他们查看你调用其他重叠API的任何其他代码的话。