2011-11-05 53 views
3

我正在尝试用asio编写一个简单的数据包crafter。我需要通过不同的协议发送原始数据。提升阿西欧原始插座

我试图从asio文档更改ping示例。在这个例子中,icpm-packet通过socket_.send_to方法发送。此方法将icmp-packet封装到ip-packet。

但我需要发送IP头,然后icmp头,然后没有任何封装的数据包正文!我试图用socket.send方法来做到这一点。但它引发了一个异常。

这是代码。 在我的课,我有:

boost::asio::basic_raw_socket<raw> socket_; 

当“生”是类原始数据的协议。这个类就像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()); 

回答

2

使用setsockopt的价值IPPROTO_IP IP_HDRINCL设置为0,它应该帮助

2

我不相信你可以发送IP报头一样,短耳使用原始套接字,或一般的短耳库。你也需要指定一个目标端点,如果你试图在没有首先连接的情况下通过套接字发送数据,你需要使用send_to()方法而不是send()方法。

我创建了一个GitHub的存储库如何使用短耳原始套接字使用自定义的传输层报头的例子:https://github.com/kevincon/asio-rawsockets-example

如果你正在寻找送自己的IP报头,可以观察到的数据包注入libpnet6的功能:http://pnet6.sourceforge.net/

2

“使用setsockopt的价值IPPROTO_IP IP_HDRINCL设置为0,它应该帮助”,

如果需要发送ip头而没有任何封装,应该将IPPROTO_IP IP_HDRINCL设置为1