Sockets 带有SetFileCompletionNotificationModes的ConnectEx能否同步返回?
在Sockets 带有SetFileCompletionNotificationModes的ConnectEx能否同步返回?,sockets,winapi,tcp,io,iocp,Sockets,Winapi,Tcp,Io,Iocp,在ConnectEx()API的MSDN页面中,没有任何关于SetFileCompletionNotificationModes()的内容,也没有关于设置标志FILE\u SKIP\u COMPLETION\u PORT\u ON\u SUCCESS是否也适用于ConnectEx() SetFileCompletionNotificationModes()的MSDN页面明确指出,如果设置了成功时的标志FILE\u SKIP\u COMPLETION\u PORT\u,则所有(全部?)应返回错误的
ConnectEx()
API的MSDN页面中,没有任何关于SetFileCompletionNotificationModes()
的内容,也没有关于设置标志FILE\u SKIP\u COMPLETION\u PORT\u ON\u SUCCESS
是否也适用于ConnectEx()
SetFileCompletionNotificationModes()
的MSDN页面明确指出,如果设置了成功时的标志FILE\u SKIP\u COMPLETION\u PORT\u,则所有(全部?)应返回错误的API都可以立即返回,而无需将重叠的IOCP循环排队
所以,我的问题是:这是否真的适用于所有接受重叠和返回错误的API
在通过调用ConnectEx()
连接套接字之前,我将套接字设置为FILE\u SKIP\u COMPLETION\u PORT\u ON\u SUCCESS
我是否应该期望通过ConnectEx()
立即返回(也就是说,它不会返回ERROR\u IO\u PENDING,并且IOCP循环将完全跳过I/O完成,例如,当连接到本地主机时)
即使在ConnectEx()
成功完成后,我刚刚设置了FILE\u SKIP\u COMPLETION\u PORT\u ON\u SUCCESS
(例如,我在ConnectEx()
的IOCP完成例程中设置),如果我通过再次调用ConnectEx()
断开并重新使用该套接字进行新连接,这就像我在ConnectEx()之前设置了那个标志一样,所以同样的问题也出现了。你为什么在意?假设不能,这意味着您需要为这一个API调用设置一个特例。假设这可能意味着调用ConnectEx()
的代码应该与调用所有其他重叠API的代码一样,WSARecv()
,WSASend()
,等等。鉴于现有文档的性质,您应该假设它可以。因此,编写没有特殊情况的代码是正确的
我希望在大多数情况下,使用真正的网络堆栈,您不太可能从ConnectEx()
获得同步返回,但是,如果您要安装某种自定义诊断Winsock提供程序,只需模拟连接,或者,如果有人发明了一种可以快速连接的网络层,那么这是可能的
在我看来,你不需要知道这个问题的答案,你只需要在给定文档的情况下编写应该编写的代码(这表示它可以同步完成)事实上,如果人们看到您的任何调用其他重叠API的代码,他们可能会希望您编写这些代码。您为什么关心这些?假设不能,这意味着您需要为这一个API调用设置一个特例。假设这可能意味着调用ConnectEx()
的代码应该与调用所有其他重叠API的代码一样,WSARecv()
,WSASend()
,等等。鉴于现有文档的性质,您应该假设它可以。因此,编写没有特殊情况的代码是正确的
我希望在大多数情况下,使用真正的网络堆栈,您不太可能从ConnectEx()
获得同步返回,但是,如果您要安装某种自定义诊断Winsock提供程序,只需模拟连接,或者,如果有人发明了一种可以快速连接的网络层,那么这是可能的
在我看来,你不需要知道这个问题的答案,你只需要在给定文档的情况下编写应该编写的代码(这表示它可以同步完成)事实上,如果人们看到您的任何其他调用其他重叠API的代码,他们可能希望您编写这些代码