我正在尝试用asio编写一个简单的数据包制作程序。我需要通过不同的协议发送原始数据。
我正在尝试更改asio文档中的ping示例。在本例中,icpm数据包是通过socket_.send_to方法发送的。此方法将icmp数据包封装为ip数据包。
但我需要发送ip报头,然后是icmp报头,然后是没有任何封装的数据包正文!我正在尝试使用socket.send方法来完成此任务。但是它抛出了一个异常。
这是代码。在我的班上,我有:
boost::asio::basic_raw_socket<raw> socket_;当' raw‘是原始数据协议的类时。这个类类似于来自asio的protocol_等于IPPROTO_RAW的'icmp‘类。
然后我发送数据:
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());发布于 2014-12-12 18:55:29
使用setsockopt将value IPPROTO_IP IP_HDRINCL设置为0。这应该会有帮助
发布于 2012-07-30 11:47:01
我不相信你可以使用Asio原始套接字或Asio库来发送这样的IP报头。此外,您还需要指定一个目的地端点,如果您试图在没有首先连接的情况下通过套接字发送数据,则需要使用send_to()方法,而不是使用send()方法。
我创建了一个github存储库,其中包含如何使用具有自定义传输层头的Asio套接字的示例:https://github.com/kevincon/asio-rawsockets-example
如果您希望发送自己的IP报头,可以研究一下libpnet6:http://pnet6.sourceforge.net/的数据包注入功能
发布于 2016-12-21 17:14:53
“使用setsockopt将IPPROTO_IP IP_HDRINCL的值设置为0。这应该会有帮助”,
如果需要发送不带任何封装ip报头,则应将IPPROTO_IP IP_HDRINCL设置为1
https://stackoverflow.com/questions/8022452
复制相似问题