getifaddrs只解析来自以太网接口(eth)或wlan接口的IP

时间:2013-01-09 12:27:51

标签: linux ip-address ipconfig

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

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

现在我只需要获取主动激活环回ip的ip 前

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

在此代码中需要更改哪些内容才能使上述内容正常工作?

1 个答案:

答案 0 :(得分:4)

更改

    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->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->ifa_addr)->sin6_addr;