【问题标题】:The getifaddrs functiongetifaddrs 函数
【发布时间】:2016-08-18 19:59:31
【问题描述】:

谁能解释一下为什么getifaddrs返回同一个接口一次,AF_PACKET和第二个AF_INET作为两个不同的接口?

当它是 AF_PACKET 时,可以通过对 sockaddr_ll 进行强制转换来获得 MAC 地址。但是这个结构有 20 个字节,而 sockaddr_in 有 16 个字节。为什么这个转换是安全的?

谢谢,

【问题讨论】:

标签: linux networking


【解决方案1】:

我最好的猜测是,这大概就是正在发生的事情:

所有 sockaddr_* 都按此顺序具有相同的公共头字段(sa_family、sa_len、sa_data)。这保证了所有 sockaddr_* 实例至少为 20 字节,并且可以使用 sockaddr 安全地覆盖/别名,尽管有一组强制转换使我们这些有权使用更强类型的语言工作的人哭泣。使案例在相反方向上安全的事情是(希望)在实施 getifaddrs 时没有人在设置 sa_family 时犯任何错误。

【讨论】:

    【解决方案2】:

    1 函数getifaddrs() 返回网络接口的网络地址。通常,网络接口可以有多个地址。

    • AF_PACKET:网络接口的链接/以太网地址
    • AF_INET:网络接口的 IPv4 地址
    • AF_INET6:网络接口的 IPv6 地址

    假设您为网络接口“eth0”分配了一个 IPv4 和一个 IPv6 地址。然后,函数getifaddrs() 为“eth0”返回三个条目:

    • 一个包含 MAC 地址
    • 一个包含分配的 IPv4 地址
    • 一个包含分配的 IPv6 地址
    1. 函数getifaddrs()返回一个指针指向struct sockaddr。因此,该实现可以执行类似于以下的操作:
      ... struct sockaddr_in6 *socka6 = malloc(sizeof(struct sockaddr_in6)); struct ifaddrs *ifa = malloc(sizeof(struct ifaddrs); ... ifa->ifa_addr= (struct sockaddr *) socka6; ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2011-10-09
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多