Я внедрил 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);
Во втором случае второй получатель ничего не получает.