我使用了以下链接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
在此代码中需要更改哪些内容才能使上述内容正常工作?
答案 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
)
修改强>
如果您需要区分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;