0

我正在使用这个程序来查找我的 Debian 机器的所有 IP 地址。虽然我可以通过使用“ifaddrs”结构的 ifa_name 字段来删除我的环回地址,例如

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

我想知道有什么方法可以从IP地址列表中找出IP地址是否是本地链接(一个仅用于网段内通信且有效的网络地址)。提前致谢。

4

3 回答 3

1

此代码检查 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)

于 2020-07-06T16:41:20.017 回答
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与该前缀进行比较。
于 2013-10-28T16:47:10.060 回答
0

以下代码段可用于确定 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
}
于 2019-09-08T07:34:28.020 回答