簡體   English   中英

如何使用原始套接字在 C 中接收 ICMP 請求

[英]How to receive ICMP request in C with raw sockets

這是一個任務,它必須使用原始套接字。 我需要編寫一個簡單的 icmp ping。 我用它作為基礎http://www.pdbuchan.com/rawsock/icmp4.c 第 127 行是 wlan0,我使用的是 eth0。 在第 290 行中,我對此進行了編碼:

struct sockaddr_in rec;
  
unsigned char * pkt = (unsigned char *) malloc (IP_MAXPACKET * sizeof (unsigned char));

if (recvfrom (sd, (void*)pkt, IP4_HDRLEN + ICMP_HDRLEN+datalen , 0, NULL, (socklen_t*)sizeof (struct sockaddr)) < 0)  {
  perror ("recvfrom() failed ");
  exit (EXIT_FAILURE);
}
struct ip *ip = (struct ip *)pkt;
struct icmphdr *icmp = (struct icmphdr *)(pkt + IP4_HDRLEN);

printf("%s %s %d\n",(char*)inet_ntoa(*(struct in_addr*)&ip->ip_dst),
        (char*)inet_ntoa(*(struct in_addr*)&ip->ip_src),
        icmp->type);
free (pkt);

問題是 ip_dst 和 ip_src 顯示為我機器的 IP,而 icmp 類型顯示為 0 而不是 8。Wireshark 顯示 icmp 回復和請求。 可能我的 recvfrom 是錯誤的,但我聽說 linux 自己的 TCP/IP 可能正在處理數據包。 如果這是真的,那么解決方法是什么?

編輯:我檢查了這個原始套接字偵聽器,但它沒有解決我的問題。

我認為您在使用 IPPROTO_RAW 時不會得到回復。

你必須使用

socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);

使用 IPPROTO_ICMP 只能發送一個 ICMP 數據包,而不是整個 IP 數據包。

但是,在接收時,您將獲得整個 IP 數據包,並且必須提取 ICMP 回復。 請注意,您將獲得發送到主機的所有 ICMP 數據包的副本,因此您必須對其進行過濾。

暫無
暫無

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

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