我正在开发一个简单的通信客户端,在两者之间。WindowsAndroid 使用 Boost-Asio 和 UDP. 当在Windows上解析主机名和IP地址时,我得到了我的计算机名称和一个有效的ip-address。然而,在android上的等价代码返回 localhost
和 127.0.0.1
.如何获得一个可从其他客户处使用的ip地址?
获取本地ip地址的片段
auto io_service = asio::io_service();
auto resolver = asio::ip::udp::resolver(io_service);
const auto host_name = asio::ip::host_name(); // "localhost" on android
const auto query = asio::ip::udp::resolver::query(host_name, "");
const auto begin = resolver.resolve(query);
const auto end = asio::ip::udp::resolver::iterator{};
for (
auto it = resolver.resolve(query);
it != end;
++it
) { auto ip = it->endpoint().address(); } // only 127.0.0.1 on android
Android Manifest。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
笔记
我的确是通过以下方法找到了正确的IP-地址 Java WifiManager. 然而,我想直接从以下方面获得它 C++/boost::asio
在我的应用程序的一侧,其余的网络代码都在那里。
我从来没有尝试过用C++为Android编码,而是用ReactJS或直接在Java中获取IP的方法,例如:"我的电脑名和IP地址"。
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
我想说的是,你很有可能应该从 WifiManager作为Android下的权威源 - 这是我的我一直听到的Android大师。鉴于你想坚持到 boost::asio
让我们仔细看看你的库。
如果你查看Boost-Asio的源代码,例如在 boost/asio/ip/host_name.hpp
我看到一个 单一 召唤 boost::asio::detail::socket_ops::gethostname(name, sizeof(name), ec)
其中位于 asio/detail/socket_ops.hpp
. 我期望在所有可能的套接字上进行循环,因为可以有多个接口。我不知道在Android系统下,socket接口的顺序是什么。
换句话说,我不知道在Android下套接字接口的顺序是什么。也许在安卓系统下你的库只是(不)幸运地得到了错误的套接字,而这个套接字恰好是回环接口与 127.0.0.1
作为IP.你现在可以写你自己的 asio::ip::gethostname()
函数,该函数试图查询底层的 asio::detail::socket_ops::gethostname()
不止一次。