我对网络编程很陌生。下面的结构定义让我很困惑。这里,h_addr_list被定义为string数组,但它用于存储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) */
};发布于 2013-12-18 13:34:33
结构定义可以追溯到C支持void * (或void,或原型)之前的时代。在当时,char *是“通用指针”。这就解释了网络功能接口的一些奇怪之处。
它还可以追溯到有许多不同的网络系统(IPX/SPX、SNA、TCP/IP、…)的时代。。如今,TCP/IP占据主导地位,但即使是现在,您也可以返回一个IPv4数组或一个IPv6地址数组,因此指定struct in_addr或struct in6_addr都会导致问题。
这样做的目的是让您有一组指向适当结构类型的指针。现在,它将被写成void **h_addr_list --一个void *数组。但是当结构第一次定义时,这个选项是不可用的,其余的都是历史(如果可以避免的话,在接口标准化之后,您不会更改它)。
发布于 2013-12-18 13:18:27
在创建结构时,创建者不确定AF_INET是否会是获胜的地址类型。
如果h_addrtype不是AF_INET,怎么办?然后h_addr_list将包含非struct in_addr的地址。
现在,几十年后,我们发现IPV4地址正在耗尽。不久,struct inaddr将越来越多地被IPV6地址所取代。
https://stackoverflow.com/questions/20658920
复制相似问题