解释:调用该函数可以从域名返回与此域名相关的地址信息,存储在hostent结构体里,返回结构体在内存中的地址。难点是如何存取和理解结构体中的变量。
char ** h_addr_list :这是一个二级指针,h_addr_list存储了一个指针的地址,而该指针指向一个char型变量。
(2)
h_addr_list 实际上存储的是一个指针数组的首地址,从该地址开始存储了数个指针。32位内存下,每4个字节存储一个地址。64位架构下每8字节储存一个内存地址。显然64位有比32位更大的内存寻址能力。而且奇特的是,指针数组的最后存储了一个空地址,null,表示数组的结束。因为int a[3] ,常规数组a里存三个数,我们是无法确定数组大小的,内存里数据都是连续的。丢掉编译时候的符号表,数组a的大小无从所知。而hostent结构体里,没分量表示指针数组的大小,因此以最后一个空指针表示指针数组的结束。
(3)
这也就解释了22 与26 行,为什么可以在for循环里如此引用h_addr_list中的值。而如h_addr_list[3],到底是内存地址从h_addr_list加12还是24字节,跟32位cpu还是64位cpu有关。这不是我们需要考虑的。但编译器编译此段代码会正确的解析到h_addr_list开始的每个内存地址值。
(4)
h_addr_list被定义为 char **,更合适的是定义为 (void * * )a,表示a存储了指针的地址,而指针又指向了某种不明确的变量。但早期没有这样的c语法。故以字节形式的char代替。
伊圣雨《TCP/IP网络编程》域名解析解释
于 2022-11-14 00:12:07 首次发布