首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么struct中的h_addr_list是char **而不是struct in_addr **?

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

Stack Overflow用户
提问于 2013-12-18 13:00:17
回答 2查看 6.7K关注 0票数 13

我对网络编程很陌生。下面的结构定义让我很困惑。这里,h_addr_list被定义为string数组,但它用于存储in_addr结构的数组。为什么它不定义为struct in_addr **h_addr_list而不是char **h_addr_list

代码语言:javascript
复制
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) */
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-18 13:34:33

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

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

这样做的目的是让您有一组指向适当结构类型的指针。现在,它将被写成void **h_addr_list --一个void *数组。但是当结构第一次定义时,这个选项是不可用的,其余的都是历史(如果可以避免的话,在接口标准化之后,您不会更改它)。

票数 16
EN

Stack Overflow用户

发布于 2013-12-18 13:18:27

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

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

现在,几十年后,我们发现IPV4地址正在耗尽。不久,struct inaddr将越来越多地被IPV6地址所取代。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20658920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档