【发布时间】:2010-03-27 19:27:21
【问题描述】:
是否有任何可扩展的 Win32 API(如 IOCP 而不是 select)为您提供反应器风格 套接字上的操作? AFAIK IOCP 允许您接收已完成操作的通知 喜欢读取或写入的数据(前摄器),但我正在寻找反应堆风格的操作:我 当套接字可读或可写(反应器)时需要得到通知。
类似epoll、kqueue、/dev/poll的东西?
Win32 中有这样的 API 吗?如果是这样,我在哪里可以找到它的手册?
** 澄清:** 我需要select 之类的 api 用于与 IOCP 一样可扩展的套接字,或者我正在寻找一种在类似反应器的操作中使用 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
我该怎么做?
【问题讨论】:
-
为什么你觉得你需要以'reactor'风格设计你的代码?为什么不能简单地使用 IOCP ?它运行良好,模型很容易理解,只要您花一点时间了解它。
-
我想创建一个 tiny 跨平台 select-like
C库,它将在 Linux 上使用 epoll,在 FreeBSD 上使用 kqueue,在 Solaris 和 HP-UX 上使用/dev/poll, IOCP 在 Windows 上,在通用 UNIX 上轮询并在所有其他上选择。除了 IOCP 之外,所有这些 API 都是反应器风格的 API,所以我更喜欢坚持使用它们。另一个问题是操作取消在前摄器风格的 API 中更复杂,并且在 XP 和更低版本的 IOCP 下非常有问题。 (是的,我熟悉 ASIO、Libevent 和其他人......所以不要建议他们) -
接受这一点,因为它是跨平台的并且您正在做出妥协,它永远不会像它可能的那样高性能,只需在 Windows 上使用 select 并在必要时使用额外的线程来处理句柄限制...
-
s/clearification/clarification/g 请。
标签: winapi sockets select iocp reactor