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

我是网络编程的新手。 以下结构定义让我很困惑。 这里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 ,或原型)。 在那些日子里, char *是’通用指针’。 这解释了网络function接口的一些奇怪之处。

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

目的是你有一个指向适当结构类型的指针数组。 如今,它将写成void **h_addr_list – 一个void *数组。 但是,当首次定义结构时,此选项不可用,其余的是历史记录(如果可以避免,则在标准化之后不会更改界面)。

在创建结构时,创建者不确定AF_INET是否将成为获胜的地址类型。

如果h_addrtype不是AF_INET,该怎么办? 然后h_addr_list将包含非struct in_addr地址。

现在,几十年后,我们发现IPV4地址已经用完。 很快, struct inaddr将被IPV6地址越来越多地取代。