MOn*_*DaR 30 c++ ip-address boost-asio
我目前正在寻找一种获取本地IP地址的便携方式.因为我正在使用Boost,我认为使用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)
这是我从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)
小智 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 来说是一个糟糕的解决方案......呃。
您可以使用您发布的代码找到"您的"地址.但是......它变得复杂了.可能有多个NIC,可能有LAN和WAN地址,有线和无线,环回...在我的桌面上我有一个网卡但两个ips来自我的局域网上的两个差异DHCP服务器...
我发现最好让用户提供绑定到命令行参数的IP.是的,这是一个便携式解决方案!:-)
| 归档时间: |
|
| 查看次数: |
30537 次 |
| 最近记录: |