来自tun设备的read(),而不删除从OS缓冲区读取的数据

时间:2015-04-25 14:35:34

标签: linux-kernel network-programming network-protocols file-descriptor tun

简短版。是否有Linux API允许从文件描述符(类似于read())读取而不实际从OS缓冲区中删除数据?将read()拆分为front()(不删除时读取)和pop()(remove)等效的方法。

方案即可。我有一个TUN设备,我用它来通过我自己的网络堆栈提供IP数据报。问题是,特别是当上面的应用程序使用UDP时,操作系统可能会使TUN设备充斥着数据,我的堆栈无法快速管理。

目标即可。我想:一旦数据报到达TUN设备就读取数据报,而不将其从内核缓冲区中移除,检查数据报,确定下面的其他专有协议栈可以处理它,如果是这样,pop()来自内核缓冲区的数据,否则保持数据。

为什么即可。它与内核缓冲区的pop()有所不同的原因是上面的应用程序实际上可以意识到网络协议的较低层是拥塞的(因为它自己的write()或send()通过网络接口会失败),并采取相应行动。如果数据被删除,就像常规的read()一样,应用程序没有任何关于拥塞的线索,并且保持泛滥。

1 个答案:

答案 0 :(得分:0)

源可用,因此您始终可以编写这样的选项。

您还可以将iptables-j TEE选项to duplicate packets一起使用到第二个界面并从那里阅读。原件将保持未读状态。

不是最好的答案,我同意......