我正在编写一个模拟套接字行为的跨平台库,在其间具有附加功能(App-> mylib->套接字)。
我希望它对程序员来说是最透明的,所以原语如select和poll必须与此lib 相关。
问题是当数据在真实套接字中变得可用时(例如),它将不得不经历大量处理,因此如果选择指向真实套接字fd,app将被阻塞很多时间。我希望select / poll仅在数据准备好被消费时解锁(在我的lib完成所有处理之后)。
所以我遇到了这个 eventfd ,它允许我完全按照自己的意愿行事,即操纵给定fd上的选择/投票行为。
由于我对Linux环境更加熟悉,我不知道与eventfd等效的windows是什么。试图搜索但没有运气。
注意: 其他方法是使用与接口连接的另一个套接字,但这似乎是如此多的开销。使用所有数据进行系统调用只是因为Windows没有(看起来如此)此功能。
或者我可以实现我自己的选择,重新发明轮子。 = /
答案 0 :(得分:2)
没有。 eventfd
是一个特定于Linux的功能 - 它甚至不能在其他UNIX操作系统上使用,例如BSD和Mac OS X.
答案 1 :(得分:2)
是的,但这太荒谬了。您可以创建一个分层服务提供程序(全局安装...),它可以摆弄系统的网络堆栈。您可以自己实现所有WinSock2函数,并将其中大部分函数转发给底层TCP。防火墙或防病毒程序经常使用它将自己插入堆栈并查看正在发生的情况。
在您的情况下,您希望使用ioctl为您的应用程序启用“特殊”行为。每当应用程序尝试创建套接字时,它都会转发到您的函数,而该函数又会打开一个真正的TCP套接字(比方说)。您可以使用WinSock函数从内核创建一个虚拟句柄,而不是返回那个HANDLE,而是将其提供给应用程序。你在一个线程中做你的东西。然后,当应用程序调用虚拟句柄上的WinSock函数时,它们最终会执行读取,选择等操作。您可以将虚拟句柄上的选择通知与实际句柄上的选择通知分离。这使得您可以执行以下操作:例如,透明地为应用程序提供一个套接字,该套接字以加密方式单独包装数据,与原始套接字无法区分。 (几乎无法区分!您可以在句柄上调用一些LSP API,以确定是否有实际和基础句柄没有给出。)
相当沉重,在某些方面是可怕的。但是,它就在那里......希望这是一个有用的概述。