繁体   English   中英

关于recvfrom()的Ping程序在C中实现的疑惑

[英]Ping program implementation in C about recvfrom() doubts

我在网上找了很久。 但是没有用。 请帮助或尝试提供一些想法如何实现这一点。

程序写完了,今天测试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包

ICMP 类型 8 控制消息是回声请求。 类型 0 是回声回复。 因此,听起来除了对这些请求的答复之外,您的程序还在接收自己的请求。 如果您成功 ping 回环地址,那很自然,因为这就是环回的工作方式。

对于 TCP 和 UDP 来说,这不是什么问题,因为这些协议提供了顶层普通 IP 上的端口概念,以区分通过相同地址进行通信的不同应用程序。 ICMP 没有,因此接收 ICMP 消息的进程负责执行自己的消息过滤。 特别是 ping 程序可能会忽略除回显回复(类型 0)之外的传入 ICMP 消息。 它可能进一步使用 ICMP 标头的后四个八位字节来区分对它自己的回显请求的答复和对同时运行的其他程序的答复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM