3

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

我希望它对程序员来说是最透明的,所以像 select 和 poll 这样的原语必须与这个 lib 相应地工作

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

所以我遇到了这个eventfd,它允许我做我想做的事,即操纵给定 fd 上的选择/轮询行为

由于我更熟悉 Linux 环境,我不知道windows 相当于 eventfd 是什么。试图搜索但没有运气。

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

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

4

2 回答 2

2

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

在您的情况下,您希望使用 ioctl 为您的应用程序打开“特殊”行为。每当应用程序尝试创建一个套接字时,它都会被转发到您的函数,该函数又会打开一个真正的 TCP 套接字(比如说)。但是,您没有返回该 HANDLE,而是使用 WinSock 函数从内核创建请求一个虚拟句柄,并将其提供给应用程序。你在一个线程中做你的事情。然后,当应用程序在虚拟句柄上调用 WinSock 函数时,它们最终会出现在您的读取、选择等的实现中。您可以将虚拟句柄上的选择通知与实际句柄上的通知分离。这让您可以做一些事情,例如,透明地为应用程序提供一个套接字,该套接字以加密的方式以各种方式包装数据,与原始套接字没有区别。(几乎无法区分!

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

于 2012-12-19T20:48:45.003 回答
2

空无一人。eventfd是 Linux 特有的特性——它甚至在其他 UNIXy 操作系统上都不可用,例如 BSD 和 Mac OS X。

于 2012-12-19T18:50:15.633 回答