c - I/O 完成端口中的 select() 等价

标签 c sockets winapi winsock winsock2

我正在 Windows 中使用 WinSock 2.0 开发代理服务器。如果我想在阻塞模型中开发它,select() 是等待客户端或远程服务器从中接收数据的方法。是否有任何适用的方法可以使用 I/O 完成端口来执行此操作?

我曾经使用 I/O 完成端口为两个方向的数据设置两个上下文。但是有一个 WSARecv 未决无法从远程服务器接收任何数据!我找不到问题。

提前致谢。

编辑。 Here是当前开发的 I/O 完成端口上的 WorkerThread 代码。但我问的是如何实现 select() 等价。

最佳答案

I/O 完成端口指示 I/O 操作何时完成,但不指示何时可以启动操作。在许多情况下,这实际上并不重要。大多数情况下,如果您假设总是可以启动操作,那么重叠 I/O 模型将工作得非常好。在大多数情况下,底层操作系统只会做正确的事情并为您排队数据,直到可以完成操作。

但是,在某些情况下这并不理想。例如,您始终可以使用重叠 I/O 发送到套接字。即使远程对等端未读取并且 TCP 堆栈已开始使用流量控制并已填充 TCP 窗口,您也可以执行此操作...这只是以完全不受控制的方式使用本地计算机上的资源(并非完全不受控制,而是由同行控制,这并不理想)。我写这个here在许多情况下,您确实需要通过跟踪您有多少未完成的 I/O 写入请求并将其用作“准备好发送”的指示来积极管理此类事情。

同样,如果您想要“准备接收”指示,您可以在套接字上发出“零字节”读取。这是使用零长度缓冲区发出的读取。当有数据可读但没有数据返回时,read返回。这将向您表明连接上有要读取的数据,但恕我直言,这是毫无意义的,除非您遇到极不可能发生的情况,即 I/O page lock limit。 ,因为您最好在数据可用时读取数据,而不是强制多个内核到用户模式的转换。

总而言之,您并不真的需要问题的答案。您需要查看 API 的工作原理并编写代码来使用它,而不是试图强制 API 以您熟悉的其他 API 的工作方式工作。

关于c - I/O 完成端口中的 select() 等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24434289/

相关文章:

c - 程序如何调用函数?

java - Java的DatagramChannel.write()的含义

java - 如何防止 Java 中的 SocketInputStream.socketRead0 挂起?

c++ - 在没有连接的套接字中写入时没有错误

c++ - wstringstream 到 LPCWSTR

c - memset 空指针数组

c - 第二次机会页面替换

c - 如何解释 ffmpeg AVERROR

c++ - 等待另一个应用程序窗口

delphi - CP_UTF8 是 WriteConsoleA/WriteFile 支持的代码页吗?