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

How do I obtain my local udp ip address on Android using Boost Asio?

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

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 端获取它,其余的网络代码在该端。

我从未尝试过用 C++ 为 Android 编写代码,而是在 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 下你的图书馆只是(不)幸运地得到了错误的套接字,它恰好是 IP 为 127.0.0.1 的环回接口。 您现在可以编写自己的 asio::ip::gethostname() 函数,该函数尝试多次查询基础 asio::detail::socket_ops::gethostname()

参考资料