我是网络编程新手。以下结构定义对我来说非常困惑。这里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) */
};
答案 0 :(得分:11)
结构定义可追溯到C支持void *
(或void
或原型)之前的时代。在那些日子里,char *
是'通用指针'。这解释了网络功能接口的一些奇怪现象。
它还可以追溯到有许多不同网络系统(IPX / SPX,SNA,TCP / IP ......)的时代。目前,TCP / IP占主导地位,但即使是现在,您也可能会返回一个IPv4数组或一组IPv6地址,因此指定struct in_addr
或struct in6_addr
会导致问题。
目的是你有一个指向适当结构类型的指针数组。如今,它将写成void **h_addr_list
- void *
的数组。但是,当首次定义结构时,此选项不可用,其余的是历史记录(如果可以避免,则在标准化之后不会更改界面)。
答案 1 :(得分:2)
创建结构时,创建者不确定AF_INET是否会成为获胜地址类型。
如果h_addrtype
不是AF_INET,该怎么办?然后h_addr_list
将包含不是struct in_addr
的地址。
现在,几十年后,我们发现IPV4地址已经用完。很快,struct inaddr
将被IPV6地址越来越多地取代。