我目前正在寻找一种获取本地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中使用的修改代码:
#includeusing 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.是的,这是一个便携式解决方案!:-)
这是我从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; }
您可以使用您发布的代码找到"您的"地址.但是......它变得复杂了.可能有多个NIC,可能有LAN和WAN地址,有线和无线,环回...在我的桌面上我有一个网卡但两个ips来自我的局域网上的两个差异DHCP服务器...
我发现最好让用户提供绑定到命令行参数的IP.是的,这是一个便携式解决方案!:-)