在this users example中,使用command line utility ip中的linux获取路线。示例输出:
$ 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
感兴趣 - 而且我正在试图弄清楚如何在我的c++程序中获得相同的信息。具体地
有什么建议吗?感谢
答案 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';
}