【问题标题】:What does actually return `ioctl` `SIOCGIFCONF` on Android?在 Android 上实际返回 `ioctl` `SIOCGIFCONF` 是什么?
【发布时间】:2019-11-26 10:20:54
【问题描述】:

在 Linux 中,可以使用ioctl 获取网络接口名称和地址列表,例如,使用以下代码:

using boost::format;
using namespace std;
string report;
struct ifconf network_adapters;
network_adapters.ifc_len = 0;
network_adapters.ifc_ifcu.ifcu_buf = nullptr;
int udp_connection = socket(AF_INET, SOCK_DGRAM, 0);
int ioctl_result = ioctl(udp_connection, SIOCGIFCONF, &network_adapters);
vector<char> buf(static_cast<size_t>(network_adapters.ifc_len));
network_adapters.ifc_ifcu.ifcu_buf = buf.data();
ioctl_result = ioctl(udp_connection, SIOCGIFCONF, &network_adapters);
for(int offset = 0; offset < network_adapters.ifc_len; offset += sizeof(struct ifreq))
{
    struct ifreq *network_adapter = reinterpret_cast<struct ifreq *>(network_adapters.ifc_ifcu.ifcu_buf + static_cast<size_t>(offset));
    char ip_address[4096];
    inet_ntop(AF_INET, &network_adapter->ifr_ifru.ifru_addr, ip_address, 4096);
    report.append((format("%1% = %2%\r\n") % network_adapter->ifr_ifrn.ifrn_name % ip_address).str());
}

我希望使用此代码获得 IP4 接口的 name = ip 行,例如:

lo = 127.0.0.1
wlan0 = 192.168.1.132

但是,无论出于何种原因,地址值在 Android 操作系统中始终为 2.0.0.0。

根据netdevice(7),ifreq 结构是可能包含许多不同信息的联合。如何理解(在哪里记录)ifreq 在 Android 上包含哪些具体信息?

【问题讨论】:

    标签: android c++ sockets android-ndk


    【解决方案1】:

    你需要使用ifr_addr来访问接口的ip地址

        struct ifreq *network_adapter = reinterpret_cast<struct ifreq *>(network_adapters.ifc_ifcu.ifcu_buf + static_cast<size_t>(offset));
        struct sockaddr_in* ipaddr = (struct sockaddr_in*)&network_adapter->ifr_addr;
        char *ip_address = inet_ntoa(ipaddr->sin_addr);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多