Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么我们可以把sockaddr投给sockaddr__Linux_Sockets_Tcp_Udp - Fatal编程技术网

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:没问题,我做到了。