Как получить ответ сокета?

Я разрабатываю простую программу traceroute с помощью boost_asio, Я использую это пример. Я немного изменил этот пример для реализации 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.

0

Решение

Я не очень использовал boost asio (или boost, если на то пошло), поэтому я не уверен, в какой обработчик будет отправлена ​​ошибка истечения 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
}
}
1

Другие решения


По вопросам рекламы [email protected]