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

nou*_*fal 9 c struct pointers 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) */
};
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 13

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

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

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