2013-10-28 146 views
0

我使用this程序查找我的Debian机器的所有IP地址。虽然我可以用“ifaddrs”结构的ifa_name领域,像如何查找IP地址是否是链接本地地址

struct ifaddrs * ifAddrsStruct=NULL; 
    getifaddrs(&ifAddrsStruct); 
    if (!strcmp(ifAddrIterator->ifa_name,"lo")) 
    // Filter these addresses 

我想知道删除我的回送地址有没有什么方法可以让我找到了,从IP地址列表,无论是IP地址是一个本地链路(仅用于网段内通信的网络地址)或不是。提前致谢。

回答

0

开始:

sockaddr* addr = ifAddrsStruct->ifa_addr; 

现在,对于IPv4的链路本地地址在地址块169.254.0.0/16定义的,因此:

  • 如果addr->sa_family == AF_INET
  • 比较static_cast<sockaddr_in*>(addr)->sin_addr针对范围。

在IPv6中,他们被分配与fe80::/64前缀,所以:

  • 如果addr->sa_family == AF_INET6
  • 比较static_cast<sockaddr_in6*>(addr)->sin6_addr针对前缀。
+0

感谢您的回复。那么,我是否必须将我的IP地址与IP地址的整个范围进行比较?像memcmp()或者是否有更简单的API可用。请承担我..我是初学者.. – 302Found

+0

@ 302发现:老实说,我不确定。 –

+1

您只需比较前16位(IPv4)或64位(IPv6)。 – EJP