2016-08-02 4 views
0

В this users example маршрут получен с использованием command line utility ip в . Пример вывода:Получить адрес источника с маршрута

$ ip route get 4.2.2.1 
4.2.2.1 via 192.168.0.1 dev eth0 src 192.168.0.121 
    cache 
$ 

Обратимся к адресам следующим образом:

  • 4.2.2.1, как адрес A (назначения)
  • 192.168.0.1, как адрес B (шлюз)
  • 192.168.0.121 в качестве адреса C (источник)

В моем случае меня интересует C - и я пытаюсь выяснить, как я мог бы получить ту же самую информацию в моей программе . В частности

  • Учитывая адрес A, найти адрес C
  • не хотите использовать system или что-нибудь, что будет каким-то образом запустить команду оболочки
  • Использование допускается, и предпочтительным

Любые рекомендации ? Благодаря

+0

Для чего вам нужен? C должен быть адресом eth0. Или важно для вас, через какой интерфейс вы будете маршрутизироваться? – mash

+0

@mash Да, это важно - моя машина имеет несколько интерфейсов, поэтому я хотел бы узнать, какой из них был использован. – dtmland

ответ

2

Там вы идете:

#include <iostream> 

#include "boost/asio/io_service.hpp" 
#include "boost/asio/ip/address.hpp" 
#include "boost/asio/ip/udp.hpp" 

boost::asio::ip::address source_address(
    const boost::asio::ip::address& ip_address) { 
    using boost::asio::ip::udp; 
    boost::asio::io_service service; 
    udp::socket socket(service); 
    udp::endpoint endpoint(ip_address, 0); 
    socket.connect(endpoint); 
    return socket.local_endpoint().address(); 
} 

// Usage example: 
int main() { 
    auto destination_address = boost::asio::ip::address::from_string("8.8.8.8"); 
    std::cout << "Source ip address: " 
      << source_address(destination_address).to_string() 
      << '\n'; 
} 
+0

Отлично работает. Из любопытства, почему UDP вместо TCP? – dtmland

+1

Поскольку в этом случае вам не нужны функции, предлагаемые TCP. – mash