提升asio原始套接字

时间:2011-11-05 18:53:04

标签: c++ boost boost-asio

我正在尝试用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());

3 个答案:

答案 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