RAW Socket: как фильтровать пакеты в RAW Socket
? Я пытался захватить UDP packets
в серверной программе, но получал все пакеты. Есть ли какая-либо функция или команда для фильтрации пакетов в Linux.Как фильтровать пакеты в гнезде RAW в LINUX
1
A
ответ
2
Использование LSF/BPF (см https://www.kernel.org/doc/Documentation/networking/filter.txthttp://www.freebsd.org/cgi/man.cgi?query=bpf&sektion=4) или для интерфейса более высокого уровня, pcap
+0
При получении мы можем поместить некоторые случаи для управления пакетами. – Rocoder
0
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, int protocol);
С помощью этого протокола поле можно захватить конкретный пакет.
int fd = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
char buffer[8192]; /* single packets are usually not bigger than 8192 bytes */
while (read (fd, buffer, 8192) > 0)
{
printf ("Caught tcp packet: %s\n",
buffer+sizeof(struct iphdr)+sizeof(struct tcphdr));
}
код выше будет захватывать все TCP-пакеты. Аналогично для UDP можно использовать
socket (PF_INET, SOCK_RAW, IPPROTO_UDP);
Проверьте поле протокола в заголовке IP и игнорировать все, что не UDP. – scai
Простым решением было бы просто использовать UDP-сокеты. Если по какой-либо причине это не вариант, вам придется вручную выполнять работу - то, что предложил предыдущий комментатор. – aaaaaa123456789
@scai теперь я могу получать пакеты, я написал несколько случаев при получении пакетов. – Rocoder