当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用Boost.Asio获取本地IP地址》经验,为你挑选了2个好方法。

我目前正在寻找一种获取本地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 
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;
}

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;

 }

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


moodboom.. 5

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

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



1> SJL..:

这是我从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;

 }


根据谷歌,这不是**你的IP ..它是你机器上配置的界面的IP.

2> moodboom..:

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

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

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有