如何在安卓系统上使用Boost Asio获取我的本地udp IP地址?

问题描述 投票:4回答:1

我正在开发一个简单的通信客户端,在两者之间。WindowsAndroid 使用 Boost-AsioUDP. 当在Windows上解析主机名和IP地址时,我得到了我的计算机名称和一个有效的ip-address。然而,在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 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 在我的应用程序的一侧,其余的网络代码都在那里。

android c++ network-programming udp boost-asio
1个回答
1
投票

我从来没有尝试过用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() 不止一次。

参考文献

© www.soinside.com 2019 - 2024. All rights reserved.