使用Boost.Asio获取本地IP地址

MOn*_*DaR 30 c++ ip-address boost-asio

我目前正在寻找一种获取本地IP地址的便携方式.因为我正在使用Boost,我认为使用Boost.Asio来完成这项任务是个好主意.

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

官方Boost.Asio文档

一些亚洲页面

我只是略微修改了两个代码.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表示loopback使用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;
}
Run Code Online (Sandbox Code Playgroud)

SJL*_*SJL 7

这是我从python网络编程(google)中学到的一个技巧,可以找出我机器的ip地址.这仅适用于您有互联网连接并且可以连接到google.com并且确实给我家用机器的192.168.xx私人地址.

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;

 }
Run Code Online (Sandbox Code Playgroud)

  • 根据谷歌,这不是**你的IP ..它是你机器上配置的界面的IP. (6认同)

小智 5

如果您编辑 /etc/hosts 文件(仅适用于 *nix,也可能适用于 Windows...我不确定),您可以纠正此问题。

在主机文件中,您会发现类似以下内容:(这是 Ubuntu,注意 1.1)

127.0.0.1 本地主机
127.0.1.1 yourPcName.yourNetwork.tld

如果你将此文件更改为

127.0.0.1 本地主机
127.0.1.1 yourPcName.yourNetwork.tld
your.real.ip.here yourPcName

那么主机名应该正确解析。

测试正确分辨率的一种方法是使用“hostname -i”命令,该命令应该在更改主机之前错误地打印您的 IP 地址,然后在更改主机后正确地打印您的 IP 地址。

当然,这对于动态 IP 来说是一个糟糕的解决方案......呃。

  • 感谢您的提示。显然,Boost.Asio 在使用 *nix 系统时只是读取这些值。它适用于 Ubuntu 9.10、10.04 和 Suse 11.2。 (2认同)

moo*_*oom 5

您可以使用您发布的代码找到"您的"地址.但是......它变得复杂了.可能有多个NIC,可能有LAN和WAN地址,有线和无线,环回...在我的桌面上我有一个网卡但两个ips来自我的局域网上的两个差异DHCP服务器...

我发现最好让用户提供绑定到命令行参数的IP.是的,这是一个便携式解决方案!:-)