为什么我们可以将sockaddr转换为sockaddr_in

Jea*_*Luc 14 sockets linux udp tcp

我能看到为什么它是投有用sockaddrsockaddr_in,但我不明白这是怎么可能的.从我读过的内容来看,它们的大小相同,sockaddr_in并且添加它们sin_zero以使其大小相同.我想知道编译器如何知道从哪里获取信息,sockaddr_in如果它的布局不同sockaddr.

Rom*_* R. 17

这是可能的,因为你通常会转换指针,而不是结构本身.你用自然语言做的意思是"请把这个指针socket structure视为指向一个指针internet socket structure".编译器重新解释指针没有问题.

以下是评论中更详细的描述:

A的sockaddr大小为16个字节 - 前两个字节是sa_family,剩下的14个字节sa_data是任意数据.A sockaddr_in也是16字节大小 - 前2个字节是sin_family(总是AF_INET),接下来的2个字节是sin_port,接下来的4个字节是sin_addr(IP地址),最后8个字节是sin_zeroIPv4中未使用的字节并提供只保证16个字节.这样,您可以先查看sockaddr.sa_family,如果是,AF_INET则将整体解释sockaddrsockaddr_in.

A sockaddr_in不存储在sockaddr.sa_data字段内.整个sockaddr是整个sockaddr_in(当sockaddr.sa_familyAF_INET,这是).如果你拿一个sockaddr*指针并将其转换为sockaddr_in*指针,那么:

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

  • `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中未使用,仅提供1​​6个字节.这样,您可以首先查看`sockaddr.sa_family`,如果是`AF_INET`则将整个`sockaddr`解释为`sockaddr_in`. (12认同)
  • `sockaddr_in`没有存储在`sockaddr.sa_data`字段中.整个`sockaddr`**是整个`sockaddr_in`(当`sockaddr.sa_family`是`AF_INET`时).如果你把`sockaddr*'指针转换成'sockaddr_in*'指针,`sockaddr.sa_family`是`sockaddr_in.sin_family`,`sockaddr.sa_data`的字节0-1是`sockaddr_in.sin_port`,字节2-5是`sockaddr_in.sin_addr`,字节6-13是`sockaddr_in.sin_zero`. (6认同)