【发布时间】:2017-03-30 17:01:18
【问题描述】:
使用 Boost Asio 发送 ICMPv6 回显请求时,每当我执行 send_to 或 async_send_to 调用时,某些层似乎正在清除校验和。使用命令行 ping 实用程序时,没有问题。对于任何调用,当我查看 Wireshark 中的传出数据包时,所有字段:类型、代码、标识符、序列和有效负载都会被表示。加上正确的字节在调用前后的缓冲区中。看看这里的图片:
这是要重现的代码。这是 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 一定是在以某种方式干预这里。