Linux 为什么我们可以把sockaddr投给sockaddr_
我明白为什么在中将Linux 为什么我们可以把sockaddr投给sockaddr_,linux,sockets,tcp,udp,Linux,Sockets,Tcp,Udp,我明白为什么在中将sockaddr转换为sockaddr\u很有用,但我不明白这是怎么可能的。据我所知,它们大小相同,sockaddr\u in添加了sin\u zero,使其大小相同。我想知道编译器如何知道从中的sockaddr\u获取信息,如果它的布局与sockaddr不同,这是可能的,因为您通常会强制转换指针,而不是结构本身。您可以按照自然语言的意思执行“请将指向套接字结构的指针视为指向internet套接字结构的指针”。编译器在重新解释指针方面没有问题 以下是评论中更详细的描述: soc
sockaddr
转换为sockaddr\u很有用,但我不明白这是怎么可能的。据我所知,它们大小相同,sockaddr\u in
添加了sin\u zero
,使其大小相同。我想知道编译器如何知道从
中的sockaddr\u获取信息,如果它的布局与sockaddr
不同,这是可能的,因为您通常会强制转换指针,而不是结构本身。您可以按照自然语言的意思执行“请将指向套接字结构的指针
视为指向internet套接字结构的指针
”。编译器在重新解释指针方面没有问题
以下是评论中更详细的描述:
sockaddr
的大小为16个字节-前两个字节是sau系列
,其余14个字节是属于任意数据的sau数据。一个sockaddr\u in
也是16个字节的大小-前2个字节是sin\u系列
(总是AF\u INET
),接下来的2个字节是sin\u端口
,接下来的4个字节是sin\u addr
(IP地址),最后8个字节是sin_zero
,它在IPv4中未使用,仅用于确保16个字节。这样,您可以先查看sockaddr.sa_系列
,如果它是AF_INET
,然后将整个sockaddr
解释为sockaddr_in
中的sockaddr\u未存储在sockaddr.sa\u数据
字段中。整个sockaddr
是整个sockaddr\u in
(即当sockaddr.sa\u系列
是AF\u INET
时)。如果您获取一个sockaddr*
指针并将其强制转换为sockaddr\u in*
指针,则:
sockaddr.sa_族
是sockaddr_-in.sin_族
sockaddr.sa_数据的字节0-1是sockaddr_in.sin_端口
- 字节2-5是
sockaddr\u in.sin\u addr
- 字节6-13是
sockaddr\u in.sin\u zero
这似乎有些奇怪,因为本应在sockaddr中存储地址的变量是sa_数据,即char[14],而sockaddr_in使用的是无符号短字符。我假设编译器将从char[14]中读取第一个无符号短字节数,并将其作为地址,char[14]的其余部分是要发送的数据?另外,如果我添加两个结构的大小,它们的大小似乎不一样。Sinu zero似乎太大了。我只是想知道这里发生了什么!sockaddr
的大小为16个字节-前两个字节是sau系列
,其余14个字节是属于任意数据的sau数据。一个sockaddr\u in
也是16个字节的大小-前2个字节是sin\u系列
(总是AF\u INET
),接下来的2个字节是sin\u端口
,接下来的4个字节是sin\u addr
(IP地址),最后8个字节是sin_zero
,它在IPv4中未使用,仅用于确保16个字节。这样,您可以先查看sockaddr.sa_族
,如果它是AF_INET
,然后将整个sockaddr
解释为sockaddr_in
中的sockaddr_in
字段中不存储sockaddr.sa_数据。整个sockaddr
是整个sockaddr\u in
(即当sockaddr.sa\u系列
是AF\u INET
时)。如果您使用sockaddr*
指针并将其强制转换为sockaddr\u in*
指针,sockaddr.sa\u族是sockaddr\u in.sin\u族
,sockaddr.sa\u数据的字节0-1是sockaddr\u in.sin\u端口
,字节2-5是sockaddr\u in.sin\u addr
,字节6-13是sockaddr\u in.sin\u zero
@RemyLebeau:我希望你能编辑你的帖子,并在里面添加有用的评论内容(特别是第二条评论,它处理的是如何解释结构字段),这样会更清晰、更具体。@MichaelHeidelberg:没问题,我做到了。