博客
关于我
关于hostent以及in_addr结构体
阅读量:593 次
发布时间:2019-03-12

本文共 2398 字,大约阅读时间需要 7 分钟。

在Linux网络编程中,gethostbyname函数是获取主机信息的重要工具,它通过传入域名返回相应的主机信息。在本文中,我们将详细探讨该函数及其返回的数据结构hostent

hostent结构体详解

hostent结构体是gethostbyname函数返回的数据结构,其中包含了主机的各种信息。定义如下:

struct hostent {    char *h_name;          /* 主机名称 */    char **h_aliases;       /* 单级别域名列表 */    int h_addrtype;        /* 等效地址类型 */    int h_length;          /* 地址长度 */    char **h_addr_list;     /* 地址列表 */};

各成员的意义如下:

  • h_name:主机的官方名称。例如,打开www.baidu.com,则h_namewww.a.shifen.com
  • h_aliases:单级别域名列表,用于负载均衡。例如,www.baidu.com可能有多个CNAME记录。
  • h_addrtype:地址类型,值为2表示IPv4,值为6表示IPv6。
  • h_length:地址长度,例如IPv4地址长度为4。
  • h_addr_list:地址列表,为一个指针指向多个地址。使用h_addr_list[0]即可获取有效IP地址。

h_addr_list获取IP地址

h_addr_list的实际存储方式需要谨慎处理,因为某些系统可能将h_addr_list存储为域名列表或其他结构。因此,在实际编程中,应直接使用h_addr宏定义:

#define h_addr h_addr_list[0]struct in_addr *inaddr;inaddr = (struct in_addr *)h->h_addr;printf("IP Address: %x\n", inaddr->s_addr);

struct in_addr结构体

in_addr结构体用于存储网络地址,其定义如下:

struct in_addr {    in_addr_t s_addr;  /* 网络地址,即十进制IP地址转换后的整型值 */};

这里的in_addr_t根据平台定义,其通常是int类型,但可以根据系统是大端ian还是小端ian存储IP地址。多数Linux系统采用小端ian存储IP地址。

IP地址存储规则

Linux系统中,主机名到IP地址的映射采用小端ian存储方式。这意味着,一个IPv4地址(四个字节)按顺序存储在内存中的低地址部分。例如,IP地址192.168.1.1在内存中存储为:

1   .168 .1 .192  00  6b 01 00

在十六进制表示下,192.168.1.1为:

C0 A8 01 00

经转换为整型变量后,以小端ian顺序存储,即0x00 0x01 0xA8 0xC0

小程序验证

为了更直观地理解IP地址的存储方式,我们可以编写一个简单的验证程序:

#include 
#include
#include
#include
#include
#include
void show(int x) { int a = x & 0xFF000000; int b = x & 0x00FF0000; int c = x & 0x0000FF00; int d = x & 0x000000FF; printf("%x %x %x %x\n", a, b, c, d);}int main(int argc, char *argv) { struct hostent *h; if (argc != 2) { printf("usage: getip address\n"); return 1; } if ((h = gethostbyname(argv[1])) == NULL) { herror("gethostbyname"); return 1; } printf("h_name: %s\n", h->h_name); printf("h_aliases: %s\n", h->h_aliases[0]); printf("h_addrtype: %d\n", h->h_addrtype); printf("h_length: %d\n", h->h_length); struct in_addr *inaddr = (struct in_addr *)h->h_addr; printf("IP Address: %x\n", inaddr->s_addr); show(inaddr->s_addr); return 0;}

最终结果

运行该程序时,假设输入www.baidu.com,输出如下:

IP Address: 7da9873d7d a9 87 3d

0x7d, 0xa9, 0x87, 0x3d可以看出,IP地址是按小端ian顺序存储的。为了更直观地理解,我们可以利用show函数:

show(inaddr->s_addr)7d a9 87 3d在小端ian系统中:3d 87 a9 7d

小结

通过上述实验可以看出,gethostbyname函数返回的h_addr实际是struct in_addr结构体s_addr成员,其存储IP地址的方式是小端ian。对于网络编程来说,正确理解数据的存储方式至关重要,尤其是跨平台开发时。希望以上文档对您有所帮助!

转载地址:http://qocxz.baihongyu.com/

你可能感兴趣的文章
小程序提交新数据后如何返回上一页并刷新数据?
查看>>
qt c++实现的ai贪吃蛇吃满屏幕,超详细!(二)ai的具体实现
查看>>
linux 查看log日志相关命令
查看>>
div 实现光标悬停变成手型
查看>>
layer.confirm 无效
查看>>
Java 回调机制
查看>>
测试tensorflow是否安装成功 出现 SyntaxError: invalid syntax的错误
查看>>
pycharm使用(新建工程、字体修改、调试)
查看>>
什么是Numpy、Numpy教程
查看>>
Python学习笔记——元组
查看>>
异常声音检测
查看>>
打造自己的图像识别模型1— 数据准备-将图像数据转为tfrecord形式——【何之源-21个项目玩转深度学习】
查看>>
无法打开文件“opencv_world330d.lib”的解决办法
查看>>
maven项目出现 Missing artifact jdk.tools:jdk.tools:jar:1.7
查看>>
maven项目通过Eclipse上传到svn上面,再导入到本地出现指定的类找不到的问题
查看>>
maven 项目部署到tomcat下 没有class文件
查看>>
算法训练 未名湖边的烦恼(递归,递推)
查看>>
算法训练 完数(循环,数学知识)
查看>>
什么是接口
查看>>
iview组件库中,Form组件里的Input,无法正确绑定on-enter事件
查看>>