簡體   English   中英

ICMP RAW 套接字不完整接收

[英]ICMP RAW Socket Incomplete Receive

我已經在 linux 中實現了一個 RAW 套接字來發送和接收 ICMP 數據包,我已經使用socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)創建了 RAW 套接字並開始使用recvfrom接收數據包。 最初,我在recvfrom中接收緩沖區 len 設置為 1000 的數據包,然后根據 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);

在第二種情況下,第二個接收沒有收到任何東西。

原始套接字不提供“流”范例。 因此,您可以在初始recvfrom調用中根據需要接收盡可能多的數據包。 但是無論您沒有收到的任何部分都將被丟棄。 所以你的第一種方法是要走的路:提供足夠大的緩沖區來接收 IP 標頭及其 ICMP 負載。 收到之后再解析。

UDP 數據包也是如此。 參考this questionthis one UDP 顯然是一種不同的協議,但所有相同的考慮都適用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM