gpt4 book ai didi

c - 为什么 struct hostent 中的 h_addr_list 是 char ** 而不是 struct in_addr **?

转载 作者:太空狗 更新时间:2023-10-29 16:52:41 26 4
gpt4 key购买 nike

我是网络编程的新手。以下结构定义让我很困惑。这里的h_addr_list是一个定义为字符串的数组,但它用来存放in_addr结构的数组。为什么它不定义为 struct in_addr **h_addr_list 而不是 char **h_addr_list

struct hostent 
{
char *h_name; /* Official domain name of host */
char **h_aliases; /* Null-terminated array of domain names */
int h_addrtype; /* Host address type (AF_INET) */
int h_length; /* Length of an address, in bytes */
char **h_addr_list; /* Null-terminated array of in_addr structs */
};


struct in_addr
{
unsigned int s_addr; /* Network byte order (big-endian) */
};

最佳答案

结构定义可以追溯到 C 支持 void *(或者完全没有 void,或者原型(prototype))之前的时代。在那些日子里,char * 是“通用指针”。这解释了网络功能接口(interface)的一些怪异之处。

它还可以追溯到有许多不同网络系统(IPX/SPX、SNA、TCP/IP 等)的时代。如今,TCP/IP 占主导地位,但即使是现在,您也可能会返回一组 IPv4 或一组 IPv6 地址,因此指定 struct in_addrstruct in6_addr 会导致问题。

目的是您将拥有一个指向适当结构类型的指针数组。现在,它会写成 void **h_addr_listvoid * 的数组。但是这个选项在第一次定义结构时是不可用的,剩下的就是历史了(如果可以避免,你就不会在标准化之后改变接口(interface))。

关于c - 为什么 struct hostent 中的 h_addr_list 是 char ** 而不是 struct in_addr **?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20658920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com