是否可以在Reactor式操作中使用IOCP(或其他API)?

问题描述 投票:0回答:4

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

类似于 epoll、kqueue 的东西,

/dev/poll

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

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


更多说明:

IOCP 允许您在完成给定操作时收到通知。例如: select

所以我在操作完成后
收到通知——监考风格的操作。

我需要的是这样的东西:

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

我该怎么做?
    

您想查看
sockets winapi select iocp reactor-pattern
4个回答
1
投票
API。它使用 Windows 消息队列来发出信号,表示已读取句柄以进行读/写/其他操作,因此它不具有 IOCP 的并发优势,但它允许您实现标准反应器模式,而无需限制数量手柄(如

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 )。


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

0
投票

不可能。

0
投票
我检查了 Boost.Asio 源代码,它们确实具有反应器式操作并使用 IOCP。对于所有反应器式操作,使用带有

WSAWaitForMultipleEvents

的单独线程而不是 IOCP。


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

0
投票
也许这将有助于“阅读准备”事件。

© www.soinside.com 2019 - 2024. All rights reserved.