我正在尝试用asio编写一个简单的数据包工具。我需要通过不同的协议发送原始数据。
我正在尝试从asio文档中更改ping示例。在此示例中,icpm-packet通过socket_.send_to方法发送。此方法将icmp-packet封装到ip-packet。
但是我需要发送ip头,然后是icmp头,然后是没有任何封装的数据包体!我正在尝试使用socket.send方法。但它引发了一个例外。
这是代码。 在我的班上,我有:
boost::asio::basic_raw_socket<raw> socket_;
当'raw'是原始数据协议类时。这个类就像来自asio的'icmp'类,protocol_等于IPPROTO_RAW。
然后我发送数据:
IPV4header ip_header;
//fill ip_header
ICMPHeader echo_request;
//fill icmp-header
std::string body("---");
// Encode the request packet.
boost::asio::streambuf request_buffer;
std::ostream os(&request_buffer);
os << ip_header << echo_request << body;
socket_.send(request_buffer.data(), request_buffer.size());
答案 0 :(得分:2)
我不相信您可以使用Asio原始套接字或一般的Asio库发送类似的IP头。您还需要指定目标端点,如果您尝试在没有首次连接的情况下通过套接字发送,则需要使用send_to()方法而不是send()方法。
我创建了一个github存储库,其中包含如何使用带有自定义传输层标头的Asio原始套接字的示例:https://github.com/kevincon/asio-rawsockets-example
如果您要发送自己的IP标头,可以查看libpnet6的数据包注入功能:http://pnet6.sourceforge.net/
答案 1 :(得分:2)
使用setsockopt将值IPPROTO_IP IP_HDRINCL设置为0.应该有帮助
答案 2 :(得分:2)
&#34;使用setsockopt将值IPPROTO_IP IP_HDRINCL设置为0.它应该有帮助&#34;,
如果需要发送没有任何封装的ip头,应将IPPROTO_IP IP_HDRINCL设置为1