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

14

我是网络编程新手,以下结构定义对我来说相当困惑。在这里,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个回答

17

结构定义的历史可以追溯到C语言支持void *(或者根本不支持void和原型)之前的时代。在那个时代,char *是“通用指针”。这就解释了一些网络函数接口的怪异之处。

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

设计意图是您将拥有指向适当结构类型的指针数组。如今,它将被写为void **h_addr_list--一个void *的数组。但当结构体首次定义时,不存在这个选项,其余的就成了历史(如果可能的话,在标准化接口后不会更改它)。


3
当创建结构体时,创建者不确定AF_INET是否将成为获胜的地址类型。
如果h_addrtype不是AF_INET,那么h_addr_list将包含不是struct in_addr的地址。
现在,几十年后,我们发现IPV4地址正在枯竭。很快,struct inaddr将被越来越多地替换为IPV6地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接