如何使用 Boost Asio 在 Android 上获取我的本地 udp ip 地址?
How do I obtain my local udp ip address on Android using Boost Asio?
我正在使用 Boost-Asio 和 UDP 在 Windows/Android 之间开发一个简单的通信客户端.在 Windows 上解析主机名和 IP 地址时,我得到了我的计算机名和有效的 IP 地址。但是,android returns localhost
和 127.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()
。
参考资料
- How to get IP address of the device from code? and its duplicate How to get the ip address of an android mobile programatically ....?
- https://answers.unrealengine.com/questions/885603/view.html 谈到了类似的问题Unreal Engine。不同的系统,同样的效果。
- Android 网络的官方文档:https://developer.android.com/ndk/reference/group/networking
- https://android.stackexchange.com/questions/3715/is-there-a-command-or-application-similar-to-ipconfig
我正在使用 Boost-Asio 和 UDP 在 Windows/Android 之间开发一个简单的通信客户端.在 Windows 上解析主机名和 IP 地址时,我得到了我的计算机名和有效的 IP 地址。但是,android returns localhost
和 127.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()
。
参考资料
- How to get IP address of the device from code? and its duplicate How to get the ip address of an android mobile programatically ....?
- https://answers.unrealengine.com/questions/885603/view.html 谈到了类似的问题Unreal Engine。不同的系统,同样的效果。
- Android 网络的官方文档:https://developer.android.com/ndk/reference/group/networking
- https://android.stackexchange.com/questions/3715/is-there-a-command-or-application-similar-to-ipconfig