在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完成,例如,当连接到本地主机时)?
即使我在成功完成FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
之后设置了ConnectEx()
(例如,在ConnectEx()
的IOCP完成例程中进行了设置),如果我通过再次调用ConnectEx()
断开连接并将该套接字重新用于新的连接,那就像我在设置该标志之前ConnectEx()
,因此出现相同的问题。
最佳答案
你为什么在乎?假设这不能仅仅意味着您需要对此API调用进行特殊处理。假设这可能意味着调用ConnectEx()
的代码应该看起来像调用所有其他重叠API的代码(即WSARecv()
,WSASend()
等)一样。而且,鉴于现有文档的性质,您应该假定可以做到。因此,编写没有特殊情况的代码是正确的……
我希望在大多数情况下,如果使用的是真正的网络堆栈,就不太可能从ConnectEx()
获得同步返回,但是,如果要安装某种自定义的诊断Winsock提供程序,该提供程序只是为您模拟了连接,或者有人发明了可以很快连接的网络层,那么这是有可能的。
在我看来,您不需要知道这个问题的答案,您只需要编写应在给定文档的情况下编写的代码(即可以同步完成),并且事实可能是人们期望的代码无论如何,如果他们查看了您的调用其他重叠API的其他任何代码,则无论如何您都已经写过了。