sockets - ConnectEx 与 SetFileCompletionNotificationModes 能否同步返回?

标签 sockets winapi tcp io iocp

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/

相关文章:

c - 套接字连接结束,操作正在非阻塞套接字上进行

c++ - 通过 C 套接字发送结构

linux - Siege 启动错误 - 无法连接到套接字

c++ - 自定义编辑控件win32

c - 如何在WIN32 API中使用trim()文本LPWSTR类型

c# - 连续调用 NetworkStream.Write - 它有什么不同吗?

Java客户端socket返回连接超时异常

c# - 使用 SendInput 发送 U+FFFF 之外的 unicode 字符

sockets - 从单个客户端到同一端口上同一服务器的最大连接数

http - 我可以模拟来自一台客户端机器的重 http 负载吗