我在網上找了很久。但是沒有用。請幫助或嘗試提供一些想法如何實作這一點。
程式寫完了,今天測驗ping環回地址的時候,發送資料包后,函式recvfrom()收到了“第一個”資料包(型別8),第二個recvfrom()收到了回應資料包(型別0)。
后來發現奇數次的type值為8,偶數次的type值為0。
我用Wireshark抓到的實際資料包每次都有對應的回應資料包,但是recvfrom()第一次收到的是出站資料包。
// Send
if (sendto(sockfd, &sendicmp, ICMP_SIZE, 0, (struct sockaddr *) &to, sizeof(to)) == -1) {
printf("sendto() error \n");
continue;
}
// Receive
struct timeval timeout = {3, 0};//3s
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
if ((n = recvfrom(sockfd, buf, BUF_SIZE, 0, (struct sockaddr *) &from, &fromlen)) < 0) {
printf("Time out! \n");
continue;
}
nreceived ;
if (unpack(buf, n) == -1) {
printf("unpack() error \n");
}
在這里輸入圖片描述 由于type值不是0,我讓輸出的不是發送給我的ICMP包
uj5u.com熱心網友回復:
ICMP 型別 8 控制訊息是回聲請求。型別 0 是回聲回復。因此,聽起來除了對這些請求的答復之外,您的程式還在接收自己的請求。如果您成功 ping 回環地址,那很自然,因為這就是環回的作業方式。
對于 TCP 和 UDP 來說,這不是什么問題,因為這些協議提供了頂層普通 IP 上的埠概念,以區分通過相同地址進行通信的不同應用程式。ICMP 沒有,因此接收 ICMP 訊息的行程負責執行自己的訊息過濾。特別是 ping 程式可能會忽略除回顯回復(型別 0)之外的傳入 ICMP 訊息。它可能進一步使用 ICMP 標頭的后四個八位位元組來區分對它自己的回顯請求的答復和對同時運行的其他程式的答復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/334747.html
