【问题标题】:How to find whether an IP address is a link-local address or not如何判断一个 IP 地址是否是本地链接地址
【发布时间】:2013-11-07 13:20:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ linux networking ip-address


    【解决方案1】:

    开始于:

    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 与该前缀进行比较。

    【讨论】:

    • 感谢您的早日回复。那么,我是否必须将我的 ipaddress 与整个 IP 地址范围进行比较..?像 memcmp() 或者有没有更简单的 API 可用。请多多包涵..我是初学者..
    • @302Found:老实说,我不确定。
    • 您只需比较前 16 位 (IPv4) 或 64 位 (IPv6)。
    【解决方案2】:

    下面的sn-p可以用来判断一个ip是否是link-local 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
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-27
        • 2010-11-19
        • 2013-07-30
        • 1970-01-01
        • 2011-03-26
        • 2011-02-05
        • 1970-01-01
        • 2012-05-27
        相关资源
        最近更新 更多