我是网络编程的新手.以下结构定义对我来说非常困惑.这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) */ };
Jonathan Lef.. 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 *
.但是,当首次定义结构时,此选项不可用,其余的是历史记录(如果可以避免,则在标准化之后不会更改界面).
结构定义可以追溯到C支持之前的时代void *
(或void
根本不是原型).在那些日子里,char *
是"通用指针".这解释了网络功能接口的一些奇怪之处.
它还可以追溯到有许多不同网络系统(IPX/SPX,SNA,TCP/IP ......)的时代.目前,TCP/IP占主导地位,但即使是现在,您也可能会返回一个IPv4数组或一组IPv6地址,因此指定struct in_addr
或者struct in6_addr
会导致问题.
目的是你有一个指向适当结构类型的指针数组.如今,它将被写成void **h_addr_list
- 一系列的void *
.但是,当首次定义结构时,此选项不可用,其余的是历史记录(如果可以避免,则在标准化之后不会更改界面).