在 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 吗?
在通过调用 ConnectEx()
连接套接字之前,我将套接字设置为FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
。
我是否应该期望 ConnectEx()
立即返回(也就是说,它不会返回 ERROR_IO_PENDING 并且 I/O 完成将被 IOCP 循环完全跳过,例如,也许当连接是本地主机)?
即使我只是设置 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
after ConnectEx()
成功完成,(例如,我在 的 IOCP 完成例程中设置它>ConnectEx()
),如果我通过再次调用 ConnectEx()
断开连接并重新使用该套接字进行新连接,就像我之前设置该标志一样 ConnectEx()
,所以出现了同样的问题。
最佳答案
你为什么关心?假设它不能只意味着您需要为这个 API 调用提供一种特殊情况。假设可以意味着调用 ConnectEx()
的代码应该与调用所有其他重叠 API、WSARecv()
、WSASend( )
等。同时考虑到现有文档的性质,您应该假设它可以。因此,编写没有特殊情况的代码是正确的...
我希望在大多数情况下,使用真正的网络堆栈时,您不太可能从 ConnectEx()
获得同步返回,但是,如果您要安装某种自定义诊断程序Winsock 提供程序只是为您模拟了连接,或者如果有人发明了一个可以非常快速连接的网络层,那么这可能是可能的。
在我看来,你不需要知道这个问题的答案,你只需要编写根据文档应该编写的代码(它说它可以同步完成),并且事实上它可能是如果人们查看了您调用其他重叠 API 的任何其他代码,他们会认为您无论如何都会编写。
关于sockets - ConnectEx 与 SetFileCompletionNotificationModes 能否同步返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22998825/