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

时间:2013-12-18 13:00:17

标签: c pointers struct network-programming

我是网络编程新手。以下结构定义对我来说非常困惑。这里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) */
};

2 个答案:

答案 0 :(得分:11)

结构定义可追溯到C支持void *(或void或原型)之前的时代。在那些日子里,char *是'通用指针'。这解释了网络功能接口的一些奇怪现象。

它还可以追溯到有许多不同网络系统(IPX / SPX,SNA,TCP / IP ......)的时代。目前,TCP / IP占主导地位,但即使是现在,您也可能会返回一个IPv4数组或一组IPv6地址,因此指定struct in_addrstruct 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地址越来越多地取代。