【发布时间】:2011-02-10 02:03:29
【问题描述】:
我目前正在寻找一种可移植的方式来获取本地 IP 地址。因为无论如何我都在使用 Boost,所以我认为使用 Boost.Asio 来完成这项任务是个好主意。
网上有几个例子可以解决问题。例子:
Official Boost.Asio Documentation
我尝试了这两个代码,只是稍作修改。 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 还找到了我正在搜索的公共 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;
}
【问题讨论】:
-
AFAIK,ASIO 没有提供一种方法来枚举您机器的接口(Linux 上的 SIOCGIFCONF ioctl 或 Windows 上的 GetAdaptersAddresses),这似乎就是您所追求的。您显示的代码使用您的机器的主机名查询 DNS,这不是一回事,并且由于它更多地依赖于您的网络配置(特别是,DNS 必须“知道”您的机器的名称),因此不太健壮。跨度>
-
asio::ip::address_v4::loopback() 是否满足您的需求?
标签: c++ ip-address boost-asio