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的其他任何代码,则无论如何您都已经写过了。

10-04 13:33