ICMP RAW Сокет неполное получение - PullRequest
0 голосов
/ 02 июля 2018

Я внедрил RAW Socket в Linux для получения пакетов ответа ICMP, Я создал RAW Socket, используя socket(AF_INET, SOCK_RAW, IPPROTO_ICMP), и начал получать пакеты, используя recvfrom. Первоначально я получал пакеты с буфером len, установленным на 1000 в recvfrom, а затем распечатывал пакеты в соответствии с заголовками ICMP и IP.

Но когда я начинаю получать заголовки пакетов и данные по отдельности (сначала получают 20 необходимых байтов для заголовков IP, а затем находят данные len из этого заголовка и получают столько байтов данных, используя recvfrom). Мне не удалось получить часть данных, так как я не смог получить вторую часть данных.

Первый метод:

n=recvfrom(sockfd,buf,1000,0,(struct sockaddr *)&cliaddr,&clilen);
struct iphdr *ip_hdr = (struct iphdr *)buf;
struct icmphdr *icmp_hdr = (struct icmphdr *)((char *)ip_hdr + (4 * ip_hdr->ihl));

Второй метод:

struct iphdr ip_hdr;
struct icmphdr icmp_hdr;
n=recvfrom(sockfd, &ip_hdr, 20 ,0,(struct sockaddr *)&cliaddr,&clilen);
len = ip_hdr->tot_len - ip_hdr.ihl*4 ;
n=recvfrom(sockfd, &icmp_hdr, len ,0,(struct sockaddr *)&cliaddr,&clilen);

Во втором случае второй получатель ничего не получает.

1 Ответ

0 голосов
/ 02 июля 2018

Сырые сокеты не обеспечивают "потоковую" парадигму. Следовательно, вы можете получить столько пакетов, сколько захотите при первоначальном вызове recvfrom. Но то, что вы не получили, будет отброшено. Итак, ваш первый способ - это путь: предоставить достаточно большой буфер для получения заголовка IP и его полезной нагрузки ICMP. Затем проанализируйте его после того, как вы его получили.

То же самое верно для пакетов UDP. Ссылка на этот вопрос и на этот . UDP, очевидно, является другим протоколом, но применяются все те же соображения.

...