2014-11-13 3 views
0

Я разрабатываю простую программу traceroute с помощью boost_asio. Я использую это example. Я немного изменил этот пример, чтобы реализовать traceroute вместо ping.Как получить ответ сокета?

pinger(boost::asio::io_service& io_service, const char* destination) 
     : resolver_(io_service), socket_(io_service, icmp::v4()), 
     timer_(io_service), sequence_number_(0), num_replies_(0) 
{ 
    boost::asio::ip::unicast::hops option(%1%); // 1 is a param 
    socket_.set_option(option); 

    icmp::resolver::query query(icmp::v4(), destination, ""); 
    destination_ = *resolver_.resolve(query); 

    start_send(); 
    start_receive(); 
} 

У меня проблема. Когда time to live меньше, чем нужно, у меня нет никакого ответа. Я хотел бы получить что-то вроде этого:

C:\Users\>ping 91.92.100.254 -i 2 

Pinging 91.92.100.254 with 32 bytes of data: 
Reply from 10.110.50.251: TTL expired in transit. 
Reply from 10.110.50.251: TTL expired in transit. 
Reply from 10.110.50.251: TTL expired in transit. 

ответ

1

Я не использовал импульс ASIO много (или импульс, если на то пошло), так что я не уверен, какой обработчик ошибки истечения TTL будет отправлен, но это должно получить вас на правильном пути ...

Где вы начинаете жду вашего ответа, добавьте _1 заполнитель передать ошибку сокета к вашему методу handle_receive:

// Wait for a reply. We prepare the buffer to receive up to 64KB. 
// Note that you can use boost::asio::placeholders::error in place of _1 
// and boost::asio::bytes_transferred in place of _2. 
socket_.async_receive(reply_buffer_.prepare(65536), 
    boost::bind(&pinger::handle_receive, this, _1, _2)); 

Также изменения ваш заголовок handle_receive, чтобы принять код ошибки

void handle_receive(const boost::system::error_code& error, std::size_t length) { 
    if (error) { 
     // Handle error 
    } 
    else { 
     // Handle normally 
    } 
} 

Ошибка может быть передана в обработчик тайм-аута. В этом случае, вы можете проверить код ошибки там также:

// Add _1 placeholder 
timer_.async_wait(boost::bind(&pinger::handle_timeout, this, _1)); 

Кроме того, вам нужно добавить этот аргумент в обработчик:

void handle_timeout(const boost::system::error_code& error) { 
    if (error) { 
     // Handle error 
    } 
    else { 
     // Handle normally 
    } 
} 
+0

Спасибо за подробный ответ – Denis

Смежные вопросы