我正在寻找一种获取本地IP地址的便携方式。因为我正在使用Boost,所以我认为在这个任务中使用Boost.Asio是一个好主意。使用Boost.Asio获取本地IP地址
在网上有几个应该做的伎俩。例子:
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在Ubuntu 9.10的代码0.1
一位同事尝试相同的代码他的机器上,并得到了
127.0.0.2(不是笔误太...)
他编写和在SUSE 11.0 GCC 4.4.1运行(我不是100%肯定)
我不知道是否有可能改变本地主机(1 27.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必须“知道”您计算机的名称),所以它不够健壮。 – 2010-04-20 13:17:38
asio :: ip :: address_v4 :: loopback()是否满足您的需求? – yanpas 2016-06-08 20:27:24