【问题标题】:when will ifa_addr be NULL on calling getifaddrs()?何时调用 getifaddrs() 时 ifa_addr 为 NULL?
【发布时间】:2014-05-11 02:54:58
【问题描述】:

我使用 getifaddrs() 函数来获取接口的 IP 地址。从手册页中,我知道:

ifa_addr 字段引用接口的地址或 接口的链路级地址,如果存在,则为NULL。 (应参考 ifa_addr 字段的 sa_family 字段来阻止 挖掘 ifa_addr 地址的格式。)

我的问题是:ifa_addr 怎么可能是 NULL?在我看来,每个接口都有它的地址,不是吗?

我google了一晚上,我发现的每一页都只是说“这个字段可能包含一个NULL指针”,不再解释......

我真的不知道如何搜索以获取详细信息,我尝试了很多关键词,例如“getifaddrs ifa_addr NULL”……但谷歌只是向我展示了 getifaddrs() 函数的手册页……

但是,我确实只找到一页,这给了我更多信息。一点点!

http://sourceforge.net/p/bonding/discussion/77913/thread/03f93486/

那么,谁能告诉我一些关于这个主题的更详细的信息?

【问题讨论】:

  • ppp接口可能吗? google "ppp ifa_addr" 你会发现一些对这个理论的支持,例如:github.com/mcproxy/mcproxy/pull/1
  • 来自手册页:“...如果接口没有地址,ifa_addr 和其他字段实际上可以为 NULL,如果接口分配了 IP 地址,则不返回链接级地址。”
  • 我今天遇到了同样的问题,因为我的一个程序无法在数据中心托管的服务器上运行。我想知道在什么情况下接口可以没有地址也没有链接级地址。我注意到有问题的界面没有出现在 ifconfig 中。
  • 如果我们给出-a 选项,它就会出现。显然,它已经下降了。如果我运行ip link show 来检查它,它将被标记为“链接/无效”。

标签: c linux sockets ip-address


【解决方案1】:

如前所述,对于没有分配任何地址的接口,ifa_addr 字段可能为 NULL。在实践中看到这一点的一个简单方法是添加一个隧道接口:

$ sudo ip tuntap add tun42 mode tun

这将创建一个没有任何地址的隧道接口:

$ ifconfig -a
tun42: flags=4240<POINTOPOINT,NOARP,MULTICAST>  mtu 1500
    unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)

$ ip link show
5: tun42: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 500
link/none 

【讨论】:

    【解决方案2】:

    我的问题是:ifa_addr 怎么可能是 NULL?在我看来,每个接口都有它的地址,不是吗?

    这种假设是错误的,接口不需要配置 IP 地址(或 getifaddrs() 返回的其他类型的地址)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多