我已经在 linux 中实现了一个 RAW Socket 来发送和接收 ICMP 数据包,我已经使用创建 RAW Socketsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
并开始使用recvfrom
. 最初,我接收缓冲区 len 设置为 1000recvfrom
的数据包,然后根据 ICMP 和 IP 标头对数据包进行类型转换。
但是当我开始单独接收数据包标头和数据时(首先接收 IP 标头的 20 个必要字节,然后从该标头中找到数据 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);
在第二种情况下,第二个接收不接收任何东西。