博客
关于我
关于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/

你可能感兴趣的文章
ObjectInputStream、ObjectOutputStream
查看>>
JVM内存模型
查看>>
反射机制
查看>>
可变长度参数
查看>>
堆空间常用参数总结
查看>>
3、条件查询
查看>>
8、子查询
查看>>
cordova打包apk更改图标
查看>>
开启与配置SMTP服务器
查看>>
APP卡片式设计
查看>>
GitHub上传时,项目在已有文档时直接push出现错误解决方案
查看>>
云数据库
查看>>
大数据在不同领域的应用
查看>>
页面置换算法
查看>>
文件系统的层次结构
查看>>
减少磁盘延迟时间的方法
查看>>
vue(渐进式前端框架)
查看>>
权值初始化和与损失函数
查看>>
案例讨论
查看>>
算法的伪码表示
查看>>