【问题标题】:Is getifaddrs giving me duplicate network interface addresses?getifaddrs 是否给了我重复的网络接口地址?
【发布时间】:2012-05-29 21:00:45
【问题描述】:

我正在使用小型 sn-p 寻找特定的网络地址,例如:

  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 的接口上。这是什么?

【问题讨论】:

  • 好的,减去 reinterpret_cast 部分...

标签: c++ network-programming


【解决方案1】:

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

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

你可能应该检查ifa_addr-&gt;sa_family,如果这有你所期望的家庭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2011-04-24
    • 1970-01-01
    • 2020-01-14
    • 2021-01-03
    • 2011-10-09
    相关资源
    最近更新 更多