【问题标题】:Sending icmp packet with boost clears checksum bytes使用 boost 发送 icmp 数据包会清除校验和字节
【发布时间】:2017-03-30 17:01:18
【问题描述】:

使用 Boost Asio 发送 ICMPv6 回显请求时,每当我执行 send_to 或 async_send_to 调用时,某些层似乎正在清除校验和。使用命令行 ping 实用程序时,没有问题。对于任何调用,当我查看 Wireshark 中的传出数据包时,所有字段:类型、代码、标识符、序列和有效负载都会被表示。加上正确的字节在调用前后的缓冲区中。看看这里的图片:

Wireshark capture icmpv6

这是要重现的代码。这是 Boost 1.62,VS2015。

#include <boost\asio.hpp>
#include <boost\thread.hpp>

using boost::asio::ip::address_v6;
using boost::asio::ip::icmp;

const char* ICMPREQUESTBODY_ = "abcdefghijklmnopqrstuvwabcdefghi";
const unsigned short ICMPIDENTIFIER_ = 1;
unsigned short tempchecksum = 0x5d46;
unsigned int icmpsequence_ = 70;
unsigned char ICMPv6TYPEECHOREQUEST_ = 128;
unsigned char ICMPv6CODE_ = 0;

int main()
{
    boost::asio::io_service io;
    boost::asio::io_service::work iowrk(io);
    boost::thread iothread(boost::bind(&boost::asio::io_service::run, &io));

    auto source = address_v6::from_string("2601:XXX:XXX:XXX::106");
    auto destination = address_v6::from_string("2601:XXX:XXX:XXX::202");
    icmp::endpoint remote_endpoint = boost::asio::ip::icmp::endpoint(destination, 0);
    icmp::endpoint local_endpoint(icmp::v6(), 0);

    icmp::socket elsocko(io, local_endpoint);

    unsigned char icmppacket[40];
    icmppacket[0] = ICMPv6TYPEECHOREQUEST_;
    icmppacket[1] = ICMPv6CODE_;
    icmppacket[2] = (tempchecksum & 0xff00) >> 8;
    icmppacket[3] = (tempchecksum & 0x00ff);
    icmppacket[4] = (ICMPIDENTIFIER_ & 0xff00) >> 8;
    icmppacket[5] = (ICMPIDENTIFIER_ & 0x00ff);
    icmppacket[6] = (icmpsequence_ & 0xff00) >> 8;
    icmppacket[7] = (icmpsequence_ & 0x00ff);
    memcpy(&icmppacket[8], ICMPREQUESTBODY_, 32);

    elsocko.send_to(boost::asio::buffer(icmppacket), remote_endpoint);

    //boost::asio::streambuf reply_buffer_;
    //elsocko.receive_from(reply_buffer_.prepare(65535), remote_endpoint);
}

目的地没有响应,因为校验和无效。是什么原因造成的/我该如何解决?

【问题讨论】:

  • 它可能错误地认为校验和已卸载到网卡。你会碰巧知道你运行的是什么操作系统吗?
  • @stark 我正在运行 Win 10 (10.0.14393)。
  • @stark 我将我的演示应用程序放在 Win 2012R2 上,它运行良好。所以你在做某事。我在本地 nic 上没有看到任何突出的设置表明它可能正在执行此操作。我只看到 tcp 和 udp 校验和卸载选项..
  • 我将 pc 上的 nic 换成了 Intel GB,但问题仍然存在。在另一个机器上的虚拟机上尝试了旧版 Win10,它 ping 正常。
  • 我禁用了 McAfee 防火墙,这解决了问题。 McAfee 一定是在以某种方式干预这里。

标签: c++ boost ping icmp


【解决方案1】:

禁用 McAfee LiveSafe 防火墙允许 icmpv6 ping 正常工作。似乎没有直接解决此问题的设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 2013-01-25
    • 2013-12-13
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多