[英]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.