【问题标题】:getifaddrs to parse only the IP from etherenet interface (eth) or wlan interfacegetifaddrs 仅解析来自以太网接口 (eth) 或 wlan 接口的 IP
【发布时间】:2012-12-23 11:59:29
【问题描述】:

我使用了以下链接http://www.linuxhowtos.org/manpages/3/getifaddrs.htm中的程序。

但它会打印所有 IP,例如 loopback、eth0、eth1 lo 等

现在我只需要获取活动的 ip,excpet 环回 ip 前

$iffconfig eth6 链路封装:以太网 HWaddr 08:00:27:47:99:da
inet 地址:10.0.2.15 广播:10.0.2.255 掩码:255.255.255.0 inet6 地址:fe80::a00:27ff:fe47:99da/64 范围:链接 因为 ifconfig 提供了活动接口和相应的 IP

要使上述代码正常工作,必须在此代码中进行哪些更改?

【问题讨论】:

    标签: linux ip-address ipconfig


    【解决方案1】:

    改变

        if (ifa->ifa_addr == NULL)
            continue;
    
        family = ifa->ifa_addr->sa_family;
    

        if (ifa->ifa_addr == NULL)
            continue;
    
        if ((strcmp("lo", ifa->ifa_name) == 0) ||
            !(ifa->ifa_flags & (IFF_RUNNING)))
            continue;
    
        family = ifa->ifa_addr->sa_family;
    

    并在其他包含之后添加这一行

    #include <net/if.h>
    

    添加的行只是检查“lo”接口名称,包含在ifa-&gt;ifa_name 中,并检查接口的标志。测试 IFF_RUNNING 位(查看net/if.h 了解更多定义)将只返回正在运行的接口。

    如果您想检查接口的其他功能,只需检查此标志(取自net/if.h

    • IFF_UP 接口正在运行。
    • IFF_BROADCAST 有效的广播地址集。
    • IFF_DEBUG 内部调试标志。
    • IFF_LOOPBACK 接口是一个环回接口。
    • IFF_POINTOPOINT 接口是点对点链接。
    • IFF_RUNNING 已分配资源。
    • IFF_NOARP 无 arp 协议,未设置 L2 目标地址。
    • IFF_PROMISC 接口处于混杂模式。
    • IFF_NOTRAILERS 避免使用拖车。
    • IFF_ALLMULTI 接收所有多播数据包。
    • IFF_MASTER 负载平衡包的主控。
    • IFF_SLAVE 负载平衡包的从属设备。
    • IFF_MULTICAST 支持多播
    • IFF_PORTSEL 可以通过 ifmap 选择媒体类型。
    • IFF_AUTOMEDIA 自动媒体选择已启用。
    • IFF_DYNAMIC 接口关闭时地址丢失。
    • IFF_LOWER_UP 驱动程序向 L1 发出信号(自 Linux 2.6.17 起)
    • IFF_DORMANT 驱动程序发出休眠信号(自 Linux 2.6.17 起)
    • IFF_ECHO Echo 发送数据包(自 Linux 2.6.25 起)

    编辑

    如果您需要区分 IPV6 GUA 和 ULA 地址,请使用此宏

    #ifndef IN6_IS_ADDR_GLOBAL
    #define IN6_IS_ADDR_GLOBAL(a) \
            ((((__const uint32_t *) (a))[0] & htonl(0x70000000)) \
            == htonl (0x20000000))
    #endif /* IS ADDR GLOBAL */
    
    #ifndef IN6_IS_ADDR_ULA
    #define IN6_IS_ADDR_ULA(a) \
            ((((__const uint32_t *) (a))[0] & htonl(0xfe000000)) \
            == htonl (0xfc000000))
    #endif /* IS ADDR ULA */
    

    参数必须取自((sockaddr_in6 *)ifa-&gt;ifa_addr)-&gt;sin6_addr;

    【讨论】:

    • 您好,感谢您提供上述代码帮助获取 ipv4/v6 的信息。如果主机具有 ULA、GUA 和链接本地寻址 IPV6 地址,现在我只需要获取 ULA,是否存在任何单独的标志来验证这一点..?
    • 我可以在虚拟环境中使用它吗?如何在虚拟环境中设置接口?我正在运行测试程序,它每 500 毫秒检查一次 IFF_RUNNING 标志。我没有收到接口关闭,它总是发现 IFF_RUNNING 标志设置。在这件事上需要帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多