有没有办法使用 IOCP 来通知套接字何时可读/可写?

Nat*_*ith 4 sockets windows iocp

我正在寻找某种方法,当套接字变为可读/可写时(即下一个发送/接收将立即完成),在 I/O 完成端口上获取信号。基本上我想要一个重叠版本的WSASelect.

(是的,我知道对于许多应用程序来说,这是不必要的,您可以继续发出重叠的send调用。但在其他应用程序中,您希望延迟生成要发送的消息,直到最后一刻可能,如此处所讨论的在这些情况下(a) 等待套接字可写,(b) 生成下一条消息,(c) 发送下一条消息,这很有用。)

到目前为止,我能想到的最好的解决方案是生成一个线程来调用selectthen PostQueuedCompletionStatus,这很糟糕并且不是特别可扩展......有没有更好的方法?

Nat*_*ith 6

事实证明这是可能的!

基本上,技巧是:

  • 使用WSAIoctl SIO_BASE_HANDLE来查看任何“分层服务提供商”
  • 用于向 AFD 驱动程序DeviceIoControl提交AFD_POLL对基本句柄的请求(这是select内部执行的操作)

有很多很多的复杂性可能值得理解,但最终上述内容应该在实践中起作用。这应该是一个私有 API,但 libuv 使用它,并且 MS 的兼容性策略意味着它们永远不会破坏 libuv,所以你没问题。有关详细信息,请阅读从此消息开始的线程:https://github.com/python-trio/trio/issues/52#issuecomment-424591743