gpt4 book ai didi

linux-kernel - 从 tun 设备读取()而不删除从操作系统缓冲区读取的数据

转载 作者:行者123 更新时间:2023-12-01 06:24:59 28 4
gpt4 key购买 nike

短版 .是否有 Linux API 允许从文件描述符中读取(类似于 read())而不实际从操作系统缓冲区中删除数据?某种方式将 read() 拆分为等价于 front() (读取而不删除)和 pop() (删除)。

场景 .我有一个 TUN 设备,用于通过我自己的网络堆栈传送 IP 数据报。问题是,特别是当上面的应用程序使用 UDP 时,TUN 设备可能会被操作系统充斥着数据,我的堆栈无法足够快地管理这些数据。

目标 .我想:一旦数据报到达 TUN 设备就读取它,而不将其从内核缓冲区中删除,检查数据报,确定下面的专有协议(protocol)栈的其余部分是否可以处理它,如果可以,则弹出() 来自内核缓冲区的数据,否则将数据保留在那里。

为什么 .不从内核缓冲区中弹出()之所以不同,是因为上面的应用程序实际上可以意识到网络协议(protocol)的较低层是拥塞的(因为它自己的网络接口(interface)上的 write() 或 send() 会失败),并采取相应的行动。如果数据被删除,就像普通的 read() 一样,应用程序对拥塞没有任何线索,并继续泛滥。

最佳答案

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

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

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

关于linux-kernel - 从 tun 设备读取()而不删除从操作系统缓冲区读取的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29866526/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com