Как не ловить отправляемые пакеты на RAW UDP "сервере"

Столкнулся с следующей проблемой:

  1. На заданном физическом порту открываю сырой сокет (у меня это что-то типа eth0).
  2. Обрабатываю данные из пакета нужным мне образом.
  3. Отправляю обратно.

Всё работает, всё проверено, работает как надо, но создаёт много лишнего "шума".

Сама проблема/шум начинается в момент отправки. Отправил, и в тот же момент ловлю свой же пакет. Помимо этого принимающая сторона автоматически мне тоже шлёт какую-то фигню, от чего за считанные минуты лог файл в который я пишу принятое/отправленное оказывается около 1 гб.

С формированием пакетов разобрался, с правильной задачей указания адресов - тоже. Но получилась адовая спам машина. Как бы мне так извратиться, чтобы программа обрабатывала только уникальные пакеты, отбрасывая те, что я отправляю, и те, что приходят мне, как ответ на отправленное сообщение?


Ответы (1 шт):

Автор решения: eri

RAW пакеты фильтруются по BPF (через SO_ATTACH_FILTER). Это лучше чем каскал if потому как отрабатывает в ядре и отброшенный пакет не долетает до программы.

Cам асемблер bpf я компилировал через pcap_compile

struct bpf_program fp;
char filter_exp[] = "udp dst port 5555";
pcap_compile(handle, &fp, filter_exp, 0, 0)

struct bpf_program - это тоже самое что и struct sock_fprog

→ Ссылка