【问题标题】:Why is h_addr_list in struct hostent a char ** instead of struct in_addr **?为什么 struct hostent 中的 h_addr_list 是 char ** 而不是 struct in_addr **?
【发布时间】:2014-01-06 16:15:00
【问题描述】:

我是网络编程的新手。以下结构定义让我很困惑。这里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 pointers struct network-programming


    【解决方案1】:

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

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

    目的是您将拥有一个指向适当结构类型的指针数组。现在,它会写成void **h_addr_list——void * 的数组。但是这个选项在第一次定义结构的时候是不可用的,剩下的就是历史了(如果可以避免,你就不要在接口标准化后更改它)。

    【讨论】:

      【解决方案2】:

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

      如果h_addrtype 不是 AF_INET 怎么办?那么h_addr_list 将包含不是struct in_addr 的地址。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2021-12-02
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        相关资源
        最近更新 更多