2

是否有任何可扩展的 Win32 API(如 IOCP 而不是 select)可以在套接字上为您提供反应器式操作?AFAIK IOCP 允许您接收有关已完成操作的通知,例如读取或写入数据(前摄器),但我正在寻找反应器风格的操作:我需要在套接字可读或可写(反应器)时获得通知。

类似于 epoll、kqueue 的东西/dev/poll

Win32中有这样的API吗?如果是这样,我在哪里可以找到它的手册?

** 澄清:** 我需要select像 IOCP 一样可扩展的套接字 API,或者我正在寻找一种在类似反应器的操作中使用 IOCP 的方法。

更详细的说明: IOCP 允许您在给定操作完成时收到通知。例如:

WSARecv(buffer,...); // start reading
WSAWaitForMultipleEvents(...); // wait when read is done

所以我在手术完成会收到通知——监考式的操作。

我需要的是这样的:

WSARecv( NOTHING ); // start waiting for readability (not actual read)
WSAWaitForMultipleEvents(...); // wait until read would not block
// Now WSARecv would not block
WSARecv(buffer,...); // now actual non-blocking read

我怎样才能做到这一点?

4

4 回答 4

1

您想查看WSAAsyncSelect API。它使用 Windows 消息队列来表示已读取句柄以进行读/写/任何操作,因此它没有 IOCP 的并发优势,但它允许您实现标准反应器模式,而对数量没有限制手柄(如WSAWaitForMultipleEvents)。

于 2010-03-28T04:59:27.860 回答
0

我很困惑,线程阻塞等待多个事件源的反应堆模式不是吗?那将是 Windows 支持的 select()。Proactor 模式是每次调用都有一个回调,您可以通过 ReadFileEx/WriteFileEx 完成。

于 2010-03-27T19:31:12.903 回答
0

不可能。

我检查了 Boost.Asio 源,它们确实具有反应器式操作并使用 IOCP。对于所有反应器样式操作,select使用单独的线程而不是 IOCP。

于 2010-03-28T08:24:12.760 回答
0

您是否尝试将零 nNumberOfBytesToRead 传递给例如 ReadFile(socket_fd, ..)?

也许这将有助于获得“准备就绪”事件。

于 2010-06-10T19:06:44.333 回答