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

如何使用Boost Asio在Android上获取本地udp ip地址?,android,c++,network-programming,udp,boost-asio,Android,C++,Network Programming,Udp,Boost Asio,我正在使用Windows/Android和UDP开发一个简单的通信客户端。在Windows上解析主机名和ip地址时,我会得到我的计算机名和有效的ip地址。但是,android上的等效代码返回localhost和127.0.0.1。 如何从其他客户端获得可用的ip地址 获取本地ip地址的代码段 Android清单: 注释 我确实通过Java WifiManager找到了正确的ip地址。但是,我想直接从代码“C++/Booo::Asio”侧获得它,在那里,其余的网络代码是.< /P> < P>我

我正在使用Windows/Android和UDP开发一个简单的通信客户端。在Windows上解析主机名和ip地址时,我会得到我的计算机名和有效的ip地址。但是,android上的等效代码返回
localhost
127.0.0.1
。 如何从其他客户端获得可用的ip地址

获取本地ip地址的代码段

Android清单:


注释


我确实通过Java WifiManager找到了正确的ip地址。但是,我想直接从代码“C++/Booo::Asio”侧获得它,在那里,其余的网络代码是.< /P> < P>我从未尝试过用C++ C++编写Android代码,而是在ReaJJS或java中直接获得IP的方式,例如:

我想说的是,你最有可能从WifiManager那里获得IP,作为Android下的权威来源,这就是我一直从Android专家那里听到的。考虑到您希望坚持使用
boost::asio
,让我们仔细看看您的库

如果您查看Boost Asio的源代码,例如,在我看到一个调用
Boost::Asio::detail::socket\u ops::gethostname(name,sizeof(name),ec)
,它位于 在内部我希望在所有可能的套接字上都有一个循环,因为可以有多个接口。我不清楚Android下的套接字/接口的顺序

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

工具书类
  • 及其副本
  • 讨论了一个类似的问题,虚幻引擎。不同的系统,相同的效果
  • Android网络的官方文档:

我想知道的一件小事,你是否在真实设备或Android模拟器上测试了你的应用程序?在真实设备上:)
  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" />
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());