2012-12-19 88 views
3

我正在编写一个跨平台的库,它模拟套接字行为,在(App-> mylib->套接字)之间具有附加功能。是否有与eventfd相当的Windows?

我希望它是最透明的可能的程序员,所以元像select和poll必须用这个LIB相应的工作。

问题是,当数据变得可用(例如)在真实套接字中时,它将不得不经过大量处理,所以如果选择指向真实套接字fd,应用程序将被阻塞很多时间。我希望select/poll只在数据准备好被使用时解锁(在我的lib完成所有处理之后)。

所以,我碰到这个eventfd,让我做的正是我想要的,即到manipule在给定的FD选择/ poll的行为。

因为我对Linux环境更熟悉,所以我不知道什么是eventfd的等效窗口。试图寻找,但没有运气。

注意: 其他方法是使用与接口连接的另一个套接字,但似乎有这么多的开销。仅仅因为Windows没有(看起来如此)这个功能而使用所有数据进行系统调用。

或者我可以实现我自己的选择,重新发明轮子。 =/

+1

Windows只在WinSock中提供'select',这意味着它只能在网络套接字上运行,而不是在文件描述符上运行。 – 2012-12-19 18:48:52

回答

2

没有。 eventfd是Linux特有的功能 - 甚至在其他UNIXy操作系统(如BSD和Mac OS X)上都没有。

2

是的,但它很荒谬。您可以创建一个分层服务提供程序(全局安装...),以便与系统的网络堆栈一起摆弄。你可以自己实现所有的WinSock2函数,并将其大部分转发到底层的TCP。这通常被防火墙或防病毒程序用来将自己插入堆栈并查看发生了什么。

就你而言,你想要使用ioctl为你的应用程序打开“特殊”行为。每当应用程序尝试创建套接字时,它都会被转发到您的函数,然后打开一个真正的TCP套接字(比如说)。虽然不使用HANDLE,但使用WinSock函数从内核创建一个虚拟句柄,然后将其提供给应用程序。你在一个线程中做你的东西。然后,当应用程序在虚拟手柄上调用WinSock函数时,它们将最终落实到读取,选择等操作中。您可以将虚拟手柄上的选定通知与实际手柄上的通知分开。这可以让你做一些事情,例如,透明地给应用程序提供一个套接字,以每种方式将数据封装在加密中,与原始套接字无差别。 (几乎没有区别!你可以在句柄上调用一些LSP API来查看是否有实际的和底层的句柄,你没有给出。)

相当重的,在某些方面怪异。但是,它在那里......希望这是一个有用的概述。

+0

谢谢! 这似乎是Windows的完美选择,但我担心这种方法我几乎不得不为每个系统有一个完全不同的实现(纠正我,如果我错了)。我认为现在我会坚持使用AF_UNIX套接字,并在其他系统上使用本地主机上的TCP套接字(例如win)。 – Leaurus

+0

不错的选择。在可能的情况下尽量避开Windows的废话。我认为你的解决方案本质上是最佳的,因为如果你坚持使用像select这样的系统调用,你的lib必须交出一个实际的fd/socket。 –

相关问题