Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从IPv6数据包获取ICMPv6头_C++_C_Unix_Ipv6_Icmp - Fatal编程技术网

C++ 从IPv6数据包获取ICMPv6头

C++ 从IPv6数据包获取ICMPv6头,c++,c,unix,ipv6,icmp,C++,C,Unix,Ipv6,Icmp,嗨,我一直在从IPv6数据包获取ICMPv6报头 size = sizeof(sockaddr_in6); if ((lenght = recvfrom(socd, buffer, BUFSIZE, 0, (sockaddr *)&receiveSockAddr, &size)) < 0) { cerr << "recvfrom error" << endl; }

嗨,我一直在从IPv6数据包获取ICMPv6报头

        size = sizeof(sockaddr_in6);
        if ((lenght = recvfrom(socd, buffer, BUFSIZE, 0, (sockaddr *)&receiveSockAddr, &size)) < 0) {
          cerr << "recvfrom error" << endl;
        }

        ip = (ip6_hdr *) buffer;

        cout << "Payload length: " << ip->ip6_ctlun.ip6_un1.ip6_un1_plen << endl;
        cout << "Payload length ntohs: " << ntohs(ip->ip6_ctlun.ip6_un1.ip6_un1_plen) << endl;

        //icmpRec = (icmp6_hdr *) (buffer + ???offset???);
将ICMP6_ECHO_请求发送到ipv6.google.com后


但是如果我查看wireshark,有效负载长度是8字节。如何将有效负载编号从uint16\u t正确解码为十进制编号8?如何获得IPv6数据包的整个大小来计算偏移量?为什么IPv6没有国际人道主义法作为IPv4?我想这会使IPv6的工作变得非常复杂。

这可能就是问题所在,尽管我有点难以理解

显然,当使用recvfrom()时,IPv6标头会自动裁剪

引用

传出数据包会自动在其前面添加IPv6标头 (基于目标地址)。套接字上的传入数据包是 接收时已删除IPv6标头和任何扩展标头


因此,基本上,缓冲区从数据开始,偏移的字节包含一些随机的高层数据。

是:socd=socket(AF_INET6、SOCK_RAW、IPPROTO_ICMPV6)请检查recv_from的返回值。它显示实际读取的字节数。我们需要确保我们正在阅读整个标题。手册页是ICMPv6的,所以它也出现在原始套接字上,尽管我必须说我似乎无法想象为什么会出现问题-这对我来说也是非常有价值的,因为我不怀疑这是原因
Payload length: 25332
Payload length ntohs: 62562