如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?



我正在使用Boost-Asio和UDPWindows/Android之间开发一个简单的通信客户端。在Windows上解析主机名和IP地址时,我得到了我的计算机名称和有效的IP地址。但是,android 上的等效代码返回localhost127.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

安卓清单:

<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" />

笔记

我确实通过Java WifiManager找到了正确的IP地址。但是,我想直接从应用程序的C++/boost::asio端获取它,其余的网络代码位于该端。

我从未尝试过用 Android 的 C++ 编写代码,而是使用 ReactJS 或直接在 Java 中编写代码,其中获取 IP 的方法例如

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

我要说的是,您很可能应该从WifiManager获取IP作为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下套接字/接口的顺序并不明显。

换句话说:也许在Android下,您的库只是(不(幸运地获得了错误的套接字,而该套接字恰好是127.0.0.1作为IP的环回接口。 您现在可以编写自己的asio::ip::gethostname()函数,该函数尝试多次查询底层asio::detail::socket_ops::gethostname()

引用

  • 如何从代码中获取设备的IP地址? 及其副本 如何以编程方式获取安卓手机的 IP 地址....?
  • https://answers.unrealengine.com/questions/885603/view.html 谈到了虚幻引擎的一个类似问题。不同的系统,相同的效果。
  • 安卓网络官方文档:https://developer.android.com/ndk/reference/group/networking
  • https://android.stackexchange.com/questions/3715/is-there-a-command-or-application-similar-to-ipconfig

最新更新