【问题标题】:Could ConnectEx with SetFileCompletionNotificationModes return synchronously?ConnectEx 可以与 SetFileCompletionNotificationModes 同步返回吗?
【发布时间】:2014-05-24 19:06:55
【问题描述】:

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 并且 I/O 完成将被 IOCP 循环完全跳过,例如,当连接到 localhost 时)?

即使我只是设置FILE_SKIP_COMPLETION_PORT_ON_SUCCESS after ConnectEx() 成功完成,(例如,我在ConnectEx() 的 IOCP 完成例程中设置它),如果我断开连接并重用该套接字通过再次调用ConnectEx() 建立新连接,就像我设置了那个标志之前 ConnectEx(),所以出现了同样的问题。

【问题讨论】:

    标签: sockets winapi tcp io iocp


    【解决方案1】:

    你为什么在乎?假设它不能仅仅意味着您需要对这个 API 调用有一个特殊情况。假设它可以意味着调用 ConnectEx() 的代码应该看起来就像调用所有其他重叠 API、WSARecv()WSASend() 等的代码一样。此外,鉴于现有文档的性质,您应该假设它能够。所以,写没有特例的代码是对的……

    我希望在大多数使用真实网络堆栈的情况下,您不太可能从 ConnectEx() 获得同步返回,但是,如果您要安装某种自定义诊断 Winsock 提供程序,它只是模拟连接对你来说,或者如果有人发明了一个可以非常快速连接的网络层,那么它可能是可能的。

    在我看来,你不需要知道这个问题的答案,你只需要根据文档编写应该编写的代码(它说它可以同步完成)以及它可能是代码的事实如果他们查看了调用其他重叠 API 的任何其他代码,人们会期望您已经编写了。

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2011-12-19
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 2022-01-02
      • 1970-01-01
      相关资源
      最近更新 更多