【问题标题】:How do I obtain my local udp ip address on Android using Boost Asio?如何使用 Boost Asio 在 Android 上获取我的本地 udp ip 地址?
【发布时间】:2020-05-31 02:46:27
【问题描述】:

我正在使用Boost-AsioUDPWindows/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

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++ network-programming udp boost-asio


【解决方案1】:

我从未尝试使用 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)single 电话,它位于 在asio/detail/socket_ops.hpp 内。因为可以有多个接口,所以我期待所有可能的套接字都有一个循环。对我来说,在 Android 下套接字/接口的顺序并不明显。

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

参考文献

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2020-12-10
    相关资源
    最近更新 更多