Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 带有SetFileCompletionNotificationModes的ConnectEx能否同步返回?_Sockets_Winapi_Tcp_Io_Iocp - Fatal编程技术网

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的代码,他们可能希望您编写这些代码