2011-11-05 28 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