getifaddrs给我重复的网络接口地址吗?

时间:2012-05-29 21:00:45

标签: c++ network-programming

我正在寻找一个特定的网络地址,使用一个小片段,如:

  char name[INET_ADDRSTRLEN];
  struct ifaddrs *iflist;
  if (getifaddrs(&iflist) < 0)
    perror("getifaddrs");

  struct in_addr addr;
  for (struct ifaddrs *p = iflist; p; p = p->ifa_next)
    {
      if (strcmp(p->ifa_name, "lo") == 0)
        {
          addr = reinterpret_cast<struct sockaddr_in*>(p->ifa_addr)->sin_addr;
          if (inet_ntop(AF_INET, &addr, name, sizeof(name)) == NULL)
            {
              perror("inet_ntop");
              continue;
            }

          cout << name << " ---> " << if_nametoindex("lo") << " : " << addr.s_addr << endl;
        }
    }

我得到的输出是:

1.0.0.0 ---> 1 : 1
127.0.0.1 ---> 1 : 16777343

我不理解第一个结果......这不会发生在像eth#这样的事情上,但它与另一个名为bond0的接口有关。这是什么?

1 个答案:

答案 0 :(得分:6)

getifaddr是非标准的。我想你是在linux系统上使用它。那里的手册页有注释:

  

Linux上返回的地址通常是IPv4和IPv6   分配给接口的地址,但也有一个AF_PACKET地址   每          接口包含有关接口及其物理层的更低级别详细信息。在这种情况下,ifa_data字段   可能包含一个          指向struct net_device_stats的指针,定义于,包含各种接口属性和   统计

你可能应该检查ifa_addr->sa_family这是否有你想要的家庭。