getifaddrs功能

时间:2016-04-25 12:19:18

标签: linux networking

有人可以向我解释为什么getifaddrs用AF_PACKET和第二个AF_INET作为两个不同的接口返回相同的接口一次?

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

谢谢,

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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; ...