C - *(long *)(host->h_addr); 是什么意思做?

2024-03-22

我在中找到了以下代码this https://aticleworld.com/ssl-server-client-using-openssl-in-c/例子:

addr.sin_addr.s_addr = *(long *)(host->h_addr);

h_addr是 是 一个char指针和host是一个指向结构体类型的指针hostent. addr是一个类型的结构体sockaddr_in and sin_addr是一个类型的结构体in_addr. s_addr is a uint32.

大部分信息可以在这里找到:http://man7.org/linux/man-pages/man7/ip.7.html http://man7.org/linux/man-pages/man7/ip.7.html

我相当确定(long)将 char 转换为 long,但我不知道额外的星号是做什么的,特别是因为s_addr不是指针。

有人能解释一下这里发生了什么吗?


(long *)(host->h_addr)意思是解释host->h_addr作为指向 a 的指针long。这不是很便携,但大概是long在为其编写的系统上长度为 32 位。

额外的星星在*(...)取消引用现在的 along用于分配。这有效地复制了原始的所有四个字节char数组变成单个long value addr.sin_addr.s_addr。相比于(long)(*host->h_addr),这只会复制第一个char元素。

这种技术极难移植。它假定了大小和字节序long类型。您可能会想从以下事实中得到暗示:s_addr is a uint32 and do:

addr.sin_addr.s_addr = *(uint32_t *)(host->h_addr);

这实际上并没有好多少,因为字节顺序仍然受到破坏。还,uint32_t保证持有at least32 位。它可以是任何更大的位数,当您尝试使用副本读取未分配的内存时,这会调用未定义的行为(想象一下复制您的 32 位char数据为 64 位整数)。

未来有两种选择:

If your char数组已经是正确的字节顺序(即,你不关心是否h_addr[0]表示本地的最高或最低字节uint32_t), use memcpy:

memcpy(&(addr.sin_addr.s_addr), host->h_addr, 4);

这可能就是您需要的方法。另一方面,如果你想要h_addr[0]为了始终以最高字节结束,您需要尊重系统的字节顺序:

addr.sin_addr.s_addr = (host->h_addr[0] << 24) + (host->h_addr[1] << 16) + (host->h_addr[2] << 8) + (host->h_addr[3]);

可能需要一些演员阵容uint32_t一路上那里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C - *(long *)(host->h_addr); 是什么意思做? 的相关文章

随机推荐