短版。是否有 Linux API 允许从文件描述符中读取(类似于 read())而不实际从操作系统缓冲区中删除数据?某种方式将 read() 拆分为等价于 front() (读取而不删除)和 pop() (删除)。
情景。我有一个 TUN 设备,用于通过我自己的网络堆栈传送 IP 数据报。问题是,特别是当上面的应用程序使用 UDP 时,TUN 设备可能会被操作系统充斥着数据,我的堆栈无法足够快地管理这些数据。
目标。我想:一旦数据报到达 TUN 设备,就读取它,而不将其从内核缓冲区中删除,检查数据报,确定下面的专有协议栈的其余部分是否可以处理它,如果可以,则弹出() 来自内核缓冲区的数据,否则将数据保留在那里。
为什么。不从内核缓冲区中弹出()之所以不同,是因为上面的应用程序实际上可以意识到网络协议的较低层是拥塞的(因为它自己的网络接口上的 write() 或 send() 会失败),并采取相应的行动。如果数据被删除,就像普通的 read() 一样,应用程序对拥塞没有任何线索,并继续泛滥。