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

时间:2014-06-26 15:16:38

标签: c sockets winapi winsock winsock2

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

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

提前致谢。

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

1 个答案:

答案 0 :(得分:4)

I / O完成端口提供I / O操作何时完成的指示,它们不指示何时可以启动操作。在许多情况下,这并不重要。大多数情况下,如果您认为始终可以启动操作,重叠的I / O模型将非常有效。在大多数情况下,底层操作系统只会做正确的事情并为您排队数据,直到可以完成操作。

但是,有些情况下这不太理想。例如,您始终可以使用重叠的I / O发送到套接字。即使远程对等方没有读取并且TCP堆栈已经开始使用流控制并填充了TCP窗口,您也可以这样做...这只是以完全不受控制的方式使用本地计算机上的资源(并非完全不受控制,但是由同行控制,这并不理想)。我写了这个here,在许多情况下,你需要通过跟踪你有多少未完成的I / O写请求并使用它作为发送'准​​备好的指示来积极管理这类事情。 39;

同样,如果你想要准备好回忆'表示你可以发出一个零字节'读取套接字。这是一个使用零长度缓冲区发出的读取。当有数据要读取但没有返回数据时,读取返回。这会给你一个指示,即连接上有数据要读取,但恕我直言,除非你遇到I/O page lock limit的非常不可能的情况,因为你可能会在读取数据时感到毫无意义变得可用而不是强迫多个内核进入用户模式转换。

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