Как не ловить отправляемые пакеты на RAW UDP "сервере"
Столкнулся с следующей проблемой:
- На заданном физическом порту открываю сырой сокет (у меня это что-то типа eth0).
- Обрабатываю данные из пакета нужным мне образом.
- Отправляю обратно.
Всё работает, всё проверено, работает как надо, но создаёт много лишнего "шума".
Сама проблема/шум начинается в момент отправки. Отправил, и в тот же момент ловлю свой же пакет. Помимо этого принимающая сторона автоматически мне тоже шлёт какую-то фигню, от чего за считанные минуты лог файл в который я пишу принятое/отправленное оказывается около 1 гб.
С формированием пакетов разобрался, с правильной задачей указания адресов - тоже. Но получилась адовая спам машина. Как бы мне так извратиться, чтобы программа обрабатывала только уникальные пакеты, отбрасывая те, что я отправляю, и те, что приходят мне, как ответ на отправленное сообщение?
Ответы (1 шт):
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