c-对于eventfd,是否有Windows等效程序



我正在编写一个跨平台库,该库模拟套接字行为,在两者之间具有附加功能(App->mylib->sockets)。

我希望它对程序员来说是最透明的,所以像select和poll这样的基元必须相应地使用这个库

问题是,当数据在真正的套接字中可用时(例如),它必须经过大量处理,因此如果select指向真正的套接字fd,应用程序将被阻塞很多时间。我希望只有当数据准备好使用时(在我的lib完成所有处理之后)才取消阻止选择/轮询。

因此,我遇到了事件fd,它允许我做我想做的事情,即在给定fd上操纵选择/轮询行为

由于我对Linux环境更加熟悉,我不知道什么是eventfd的windows等价物。试图搜索,但没有成功。

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

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

没有。eventfd是一个特定于Linux的功能——它甚至在其他UNIXy操作系统上都不可用,比如BSD和Mac OS X。

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

在您的情况下,您可能希望使用ioctl为应用程序启用"特殊"行为。每当应用程序试图创建一个套接字时,它都会被转发到您的函数,而函数又会打开一个真正的TCP套接字。不过,您没有返回HANDLE,而是使用WinSock函数从内核创建一个请求伪句柄,并将其提供给应用程序。你做事有条不紊。然后,当应用程序在伪句柄上调用WinSock函数时,它们最终会出现在读取、选择等的实现中。您可以将伪句柄上的选择通知与实际句柄上的通知解耦。这可以让你做一些事情,例如,透明地为应用程序提供一个套接字,该套接字以加密的方式封装数据,与原始套接字无法区分。(几乎无法区分!你可以在一个句柄上调用一些LSP API,看看是否真的有一个你没有得到的底层句柄。)

重量相当重,在某些方面很可怕。但是,它就在那里。。。希望这是一个有用的概述。

最新更新