为什么我们可以将sockaddr投射到sockaddr_in

我明白了为什么将sockaddr投射到sockaddr_in是有用的,但是我不明白这是如何实现的。 从我读过的,他们是相同的大小和sockaddr_in添加sin_zero使其相同的大小。 我想知道如果编译器知道从sockaddr_in获取信息的方式是否与sockaddr_in不同,

Solutions Collecting From Web of "为什么我们可以将sockaddr投射到sockaddr_in"

这是可能的,因为你通常投了指针,而不是结构本身。 你做自然语言的意思是“请把这个指针作为指向internet socket structure的指针来对待internet socket structure ”。 编译器没有任何问题来重新解释指针。

这里是从评论中采取更详细的描述:

一个sockaddr大小是16个字节,前两个字节是sa_family ,剩下的14个字节是sa_data ,它是任意数据。 sockaddr_in大小也是16字节 – 前2个字节是sin_family (总是AF_INET ),接下来的2个字节是sin_port ,接下来的4个字节是sin_addr (IP地址),最后8个字节是sin_zero没有在IPv4中使用,只提供16个字节。 这样,你可以先看看sockaddr.sa_family ,如果是AF_INET那么把整个sockaddr解释为sockaddr_in

sockaddr_in不存储在sockaddr.sa_data字段中。 整个sockaddr是整个sockaddr_in (当sockaddr.sa_familyAF_INET时,就是这样)。 如果你拿一个sockaddr*指针并把它转换成一个sockaddr_in*指针,那么:

  • sockaddr.sa_familysockaddr_in.sin_family
  • sockaddr.sa_data字节0-1是sockaddr_in.sin_port
  • 字节2-5是sockaddr_in.sin_addr
  • 字节6-13是sockaddr_in.sin_zero