3

Краткая версия. Есть ли API-интерфейс Linux, который позволяет читать из дескриптора файла (аналогично read()) без фактического удаления данных из буфера ОС? Как-то разбить read() на эквивалент front() (читать без удаления) и pop() (удалить).чтение() с устройства tun без удаления данных, считанных из буфера ОС

Сценарий. У меня есть устройство TUN, которое я использую для доставки IP-дейтаграмм через собственный сетевой стек. Проблема в том, что, когда приложение выше использует UDP, устройство TUN может быть затоплено данными операционной системой, которые мой стек не может управлять достаточно быстро.

Цель. Я бы хотел: прочитать дейтаграмму, как только она поступит через устройство TUN, , не удаляя его из буфера ядра, проверьте дейтаграмму и решите, может ли ее обрабатывать оставшаяся часть проприетарного стека протоколов, и если это так , pop() данные из буфера ядра, в противном случае сохранить данные там.

Почему. Причина, по которой это не влияет на pop() из буфера ядра, заключается в том, что вышеприведенное приложение может фактически понять, что более низкие уровни сетевых протоколов перегружены (поскольку его собственные функции write() или send() по сетевому интерфейсу не будут выполнены) и действовать соответствующим образом. Если данные удаляются, как и при обычном read(), приложение не имеет понятия о перегрузке и продолжает наводнение.

ответ

0

Источник доступен, чтобы вы всегда могли написать такой вариант.

Вы также можете использовать iptables с опцией -j TEEto duplicate packets на второй интерфейс и прочитать оттуда. Оригиналы останутся непрочитанными.

Не лучший ответ, я согласен ...

Смежные вопросы