我明白为什么强制转换很有用sockaddr
to sockaddr_in
,但我不明白这怎么可能。据我所知,它们的大小相同sockaddr_in
添加了sin_zero
使其大小相同。我想知道编译器如何知道从哪里获取信息sockaddr_in
如果它的布局不同sockaddr
.
这是可能的,因为您通常会转换指针,而不是结构本身。你做了自然语言中的意思“请将此指针视为socket structure
作为一个指向internet socket structure
相反”。编译器重新解释指针没有问题。
以下是从评论中获取的更详细的描述:
A sockaddr
大小为 16 个字节 - 前两个字节是sa_family
,其余 14 个字节是sa_data
这是任意数据。 Asockaddr_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
as a sockaddr_in
.
A sockaddr_in
不存储在里面sockaddr.sa_data
场地。整个sockaddr
是整个sockaddr_in
(when sockaddr.sa_family
is AF_INET
, 那是)。如果你采取sockaddr*
指针并将其转换为sockaddr_in*
指针,则:
-
sockaddr.sa_family
is sockaddr_in.sin_family
- 字节 0-1 的
sockaddr.sa_data
are sockaddr_in.sin_port
- 字节 2-5 是
sockaddr_in.sin_addr
- 字节 6-13 是
sockaddr_in.sin_zero
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)