从路由获取源地址

时间:2016-08-02 23:46:17

标签: c++ linux boost routes

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或以某种方式运行shell命令的任何内容
  • 允许使用,并且首选

有什么建议吗?感谢

2 个答案:

答案 0 :(得分:4)

你去了:

#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';
}

答案 1 :(得分:0)

mash的答案几乎是正确的,但在iOS上失败。第udp::endpoint endpoint(ip_address, 0);行需要有一个非零端口,否则您将收到错误“无法分配请求的地址”,因为0不是有效的端口号。我认为端口的大小无关紧要(只要它是有效的非零端口号即可),因此我建议您使用标准的UDP STUN端口3478。

更正的代码:

#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, 3478);
  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';
}