[英]How to find whether an IP address is a link-local address or not
我正在使用这个程序来查找我的 Debian 机器的所有 IP 地址。 尽管我可以通过使用“ifaddrs”结构的 ifa_name 字段来删除我的环回地址,例如
struct ifaddrs * ifAddrsStruct=NULL;
getifaddrs(&ifAddrsStruct);
if (!strcmp(ifAddrIterator->ifa_name,"lo"))
// Filter these addresses
我想知道有什么方法可以从 IP 地址列表中找出 IP 地址是否是本地链路(旨在且仅对网段内的通信有效的网络地址)。 提前致谢。
此代码检查 IP4 地址是否为链路本地地址。
#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
struct in_addr addr = {0};
char str[INET_ADDRSTRLEN];
if (1 == inet_pton(AF_INET, "169.254.40.203", &addr)) {
// 169.254.0.0 translates to 0x0000fea9
if ((addr.s_addr & 0x0000ffff) == 0x0000fea9) {
printf("is link local\n");
} else {
printf("not link local\n");
}
}
return 0;
}
这可能只适用于小端系统(x86、AMD64)
从...开始:
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
与该前缀进行比较。以下代码段可用于确定 ip 是否为链路本地 ipv4 地址:
const char* str = "169.254.1.2";
uint32_t ipv4;
struct in_addr addrp;
if (0 != inet_aton(str, &addrp)) {
ipv4 = addrp.s_addr;
} else {
ipv4 = 0;
}
if ((ipv4 & 0xa9fe0000) == 0xa9fe0000) {
// .. This ip is link-local
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.