如何通过 ioctl 仅获取活动别名 ip?

问题描述

文件“/etc/network/interfaces”中,我定义了“eth0”接口和别名(eth0: 0,eth0: 1):

auto eth0
iface eth0 inet static
    address 192.168.3.1
    netmask 255.255.255.0
    gateway 192.168.3.10

auto eth0:0
iface eth0:0 inet static
    address 192.168.3.2
    netmask 255.255.255.0

auto eth0:1
iface eth0:1 inet static
    address 192.168.3.3
    netmask 255.255.255.0

结果我有

# ifconfig
eth0      Link encap:Ethernet  HWaddr 38:D2:69:7F:87:8C  
          inet addr:192.168.3.1  Bcast:0.0.0.0  Mask:255.255.255.0
          UP broADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:175 

eth0:0    Link encap:Ethernet  HWaddr 38:D2:69:7F:87:8C  
          inet addr:192.168.3.2  Bcast:0.0.0.0  Mask:255.255.255.0
          UP broADCAST MULTICAST  MTU:1500  Metric:1
          Interrupt:175 

eth0:1    Link encap:Ethernet  HWaddr 38:D2:69:7F:87:8C  
          inet addr:192.168.3.3  Bcast:0.0.0.0  Mask:255.255.255.0
          UP broADCAST MULTICAST  MTU:1500  Metric:1
          Interrupt:175 

但现在我想使用我的 C++ 应用程序只提取已初始化的别名的 IP 地址。为此,我在 0-9 范围内循环以查看别名是否处于活动状态。然后它会尝试从中获取 IP 地址。

std::string interface_name = "eth0";
    std::vector<std::string> finded_aliases;
    for(int i = 0; i < 10; i++)
    {
        std::string searching_interface_alias = interface_name + ":" + std::to_string(i);
        struct ifreq ifr;
        int sock = socket(PF_INET6,SOCK_DGRAM,IPPROTO_IP);
        memset(&ifr,sizeof(ifr));
        strcpy(ifr.ifr_name,searching_interface_alias.c_str());
        ioctl(sock,SIocgIFFLAGS,&ifr);
        close(sock);
        if(!!(ifr.ifr_flags & IFF_UP))
        {
            fd = socket(AF_INET,0);
            char name[searching_interface_alias.length()+1];
            strcpy(name,searching_interface_alias.c_str());
            strncpy(ifr.ifr_name,name,IF_NAMESIZE-1);
            /* Get ip address */
            ioctl(fd,SIocgIFADDR,&ifr);
            strncpy(buffor,inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr),sizeof(buffor));
            std::cout << "Finded alias: " << searching_interface_alias << ",IP: " << buffor << std::endl;
        }
    }

不幸的是,我在输出中得到了所有别名的列表

Finded alias: eth0:0,IP: 192.168.3.2
Finded alias: eth0:1,IP: 192.168.3.3
Finded alias: eth0:2,IP: 0.0.0.0
Finded alias: eth0:3,IP: 0.0.0.0
Finded alias: eth0:4,IP: 0.0.0.0
Finded alias: eth0:5,IP: 0.0.0.0
Finded alias: eth0:6,IP: 0.0.0.0
Finded alias: eth0:7,IP: 0.0.0.0
Finded alias: eth0:8,IP: 0.0.0.0
Finded alias: eth0:9,IP: 0.0.0.0

可能导致错误的原因是什么?我希望它只列出具有 ip 的活动别名

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)