c++ - 使用 Boost.Asio 获取本地 IP 地址

标签 c++ ip-address boost-asio

我目前正在寻找一种可移植的方式来获取本地 IP 地址。因为无论如何我都在使用 Boost,所以我认为使用 Boost.Asio 来完成这项任务是个好主意。

网上有几个例子可以解决问题。例子:

Official Boost.Asio Documentation

Some Asian Page

我尝试了这两个代码,只是稍作修改。 Boost.Doc 上的代码已更改为不解析“www.boost.org”,而是解析“localhost”或我的主机名。为了获取主机名,我使用了 boost::asio::ip::host_name() 或直接将其输入为字符串。

此外,我编写了自己的代码,该代码融合了上述示例以及我从 Boost 文档和其他示例中收集的(少量)知识。

所有来源都有效,但它们确实返回了以下 IP:
127.0.1.1(这不是错字,最后是 .1.1)
我使用 GCC 4.4.1 在 Ubuntu 9.10 上运行并编译了代码

一位同事在他的机器上尝试了相同的代码并得到了
127.0.0.2(也不是错字...)
他使用 GCC 4.4.1 在 Suse 11.0 上编译和运行(我不是 100% 确定)

我不知道是否可以更改 localhost (127.0.0.1),但我知道我或我的同事都没有这样做。 ifconfig 说环回使用 127.0.0.1。 ifconfig 还找到了我正在搜索的公共(public) IP(在我的例子中是 141.200.182.30,子网是 255.255.0.0)

那么这是一个 Linux 问题吗?代码不像我想象的那么可移植?我是否必须更改其他内容,或者 Boost.Asio 根本无法解决我的问题?

我知道在 Stackoverflow 和其他页面上有很多关于类似主题的问题,但我找不到对我有用的信息。如果你有有用的链接,如果你能指出我会很好。

PS: 这是我从 Boost.Doc 中使用的修改后的代码:

#include <boost/asio.hpp>
using boost::asio::ip::tcp;    

boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(boost::asio::ip::host_name(), "");
tcp::resolver::iterator iter = resolver.resolve(query);
tcp::resolver::iterator end; // End marker.
while (iter != end)
{
    tcp::endpoint ep = *iter++;
    std::cout << ep << std::endl;
}

最佳答案

这是我从 python 网络编程 (google) 中学到的一个技巧,用于计算我的机器的 IP 地址。这仅在您有互联网连接并且可以连接到 google.com 并且确实给了我家用计算机的 192.168.x.x 私有(private)地址时才有效。

try {
    boost::asio::io_service netService;
    udp::resolver   resolver(netService);
    udp::resolver::query query(udp::v4(), "google.com", "");
    udp::resolver::iterator endpoints = resolver.resolve(query);
    udp::endpoint ep = *endpoints;
    udp::socket socket(netService);
    socket.connect(ep);
    boost::asio::ip::address addr = socket.local_endpoint().address();
    std::cout << "My IP according to google is: " << addr.to_string() << std::endl;
 } catch (std::exception& e){
    std::cerr << "Could not deal with socket. Exception: " << e.what() << std::endl;

 }

关于c++ - 使用 Boost.Asio 获取本地 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2674314/

相关文章:

c++ - 完成处理程序中的 Boost 绑定(bind)错误

对 xcode 12 的 c++20 库支持

c++ - 是否可以将 std::fill 与二维 C 样式数组一起使用?

c++ - 读取 16 位 wav 文件并像 Matlab 一样对其进行归一化

php - 使用 ActionScript 获取 IP 地址?

c++ - boost .asio : can I do async_read and async_write simultaneously from one thread?

C++ MFC 应用程序在 Windows 7 上运行缓慢,但在 XP 上运行迅速

java - 将 IP 地址转换为二进制值 (Java)

dns - 将 DNS 名称指向本地计算机上的 IP 地址

c++ - Boost.Asio同步和并发数据结构模式