C - 将“h_addr_list”数组转换为“struct in_addr **”

时间:2015-12-02 18:17:57

标签: c unix struct casting network-programming

我正在阅读本教程:here但我无法理解这部分是如何工作的。从char**投射到包含struct in_addr **的{​​{1}}似乎很奇怪。

unsigned long

我希望有人能够解释发生了什么以及代码如何运作。

编辑:更具体一点:我想知道编译器如何理解我们在这里尝试做什么?为什么这段代码应该正确?

1 个答案:

答案 0 :(得分:1)

当您致电gethostbyname时,它会返回指向struct hostent的指针。此结构中的一个字段h_addr_list是指向网络地址的指针数组。

由于网络地址可以是IPv4地址的struct in_addr或IPv6地址的struct in6_addr,因此h_addr_list被定义为char **作为泛型类型这可以指向任何一个。 h_addrtype字段会告诉您哪一个有效。

如果您知道这一点,则根据需要将h_addr_list投射到struct in_addr **struct in6_addr **,然后访问数组中的每个元素。

编辑:

voidchar类型之间的指针和任何其他非函数类型可以自由地相互转换或相互转换。

在这种特殊情况下,gethostbyname可能会有一个静态char缓冲区,它会根据需要转换为struct in_addr **struct in6_addr **以创建数组。然后调用函数执行相同的强制转换以获取值。