2016-08-02 55 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
  • 不想使用​​或任何會以某種方式運行shell命令
  • 使用是允許的,並且首選

任何建議?由於

+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