nou*_*fal 9 c struct pointers network-programming
我是网络编程的新手.以下结构定义对我来说非常困惑.这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) */
};
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 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 *.但是,当首次定义结构时,此选项不可用,其余的是历史记录(如果可以避免,则在标准化之后不会更改界面).