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

 骑单车追梦的小男孩 发布于 2023-02-09 14:27

我是网络编程的新手.以下结构定义对我来说非常困惑.这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 *.但是,当首次定义结构时,此选项不可用,其余的是历史记录(如果可以避免,则在标准化之后不会更改界面).

1 个回答
  • 结构定义可以追溯到C支持之前的时代void *(或void根本不是原型).在那些日子里,char *是"通用指针".这解释了网络功能接口的一些奇怪之处.

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

    目的是你有一个指向适当结构类型的指针数组.如今,它将被写成void **h_addr_list- 一系列的void *.但是,当首次定义结构时,此选项不可用,其余的是历史记录(如果可以避免,则在标准化之后不会更改界面).

    2023-02-09 14:30 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有