我是网络编程的新手。 以下结构定义让我很困惑。 这里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支持void *
之前的时代(或者完全void
,或原型)。 在那些日子里, char *
是’通用指针’。 这解释了网络function接口的一些奇怪之处。
它还可以追溯到有许多不同的网络系统(IPX / SPX,SNA,TCP / IP,……)的时代。 目前,TCP / IP占主导地位,但即使是现在,您也可以返回一个IPv4数组或一组IPv6地址,因此指定struct in_addr
或struct in6_addr
会导致问题。
目的是你有一个指向适当结构类型的指针数组。 如今,它将写成void **h_addr_list
– 一个void *
数组。 但是,当首次定义结构时,此选项不可用,其余的是历史记录(如果可以避免,则在标准化之后不会更改界面)。
在创建结构时,创建者不确定AF_INET是否将成为获胜的地址类型。
如果h_addrtype
不是AF_INET,该怎么办? 然后h_addr_list
将包含非struct in_addr
地址。
现在,几十年后,我们发现IPV4地址已经用完。 很快, struct inaddr
将被IPV6地址越来越多地取代。
需要了解更多c/c++开发分享为什么struct hostent中的h_addr_list是char **而不是struct in_addr **?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享为什么struct hostent中的h_addr_list是char **而不是struct in_addr **?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/978932.html