gethostbyname()函数详解
来源:互联网 发布:淘宝直播在那里看 编辑:程序博客网 时间:2024/05/16 14:44
基本概念:
gethostbyname()函数主要作用:用域名或者主机名获取地址,操作系统提供的库函数。以下的讨论基于linux环境
域名系统(Domain Name System, DNS)主要用于主机名字与IP地址之间的映射。每个组织机构往往运行一个或多个名字服务器(name server),我们编写的客户端和服务器等应用程序通过调用解析器(resolver)的函数库中的函数接触DNS服务器。常见的解析器函数是gethostbyname和gethostbyaddr,图11-1展示了应用进程、解析器和名字服务器之间的一个典型关系。
函数原型:
GETHOSTBYNAME(3) Linux Programmer's Manual GETHOSTBYNAME(3)NAME gethostbyname, gethostbyaddr, sethostent, gethostent, endhostent, h_errno, herror, hstrerror, gethostbyaddr_r, gethostbyname2, gethostby‐ name2_r, gethostbyname_r, gethostent_r - get network host entrySYNOPSIS #include <netdb.h> extern int h_errno; struct hostent *gethostbyname(const char *name); #include <sys/socket.h> /* for AF_INET */ const char *hstrerror(int err);
返回值:
失败返回NULL指针
成功返回的非空指针指向如下的hostent结构:
struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses */}
hostent->h_name
表示的是主机的规范名。例如www.baidu.com的规范名其实是www.a.shifen.com。
hostent->h_aliases
表示的是主机的别名。www.baidu.com就是baidu他自己的别名。
hostent->h_addrtype
表示的是主机ip地址的类型。只会是ipv4(AF_INET),这个函数处理不了ipv6
hostent->h_length
表示的是主机ip地址的长度。
hostent->h_addr_list
表示的是主机的ip地址。是网络字节序,需要通过inet_ntop函数转换。
测试代码 gethostbyname.cpp:
#include <sys/socket.h>#include <arpa/inet.h>#include <netdb.h>#include <stdio.h>extern int h_errno;int main(int argc, char **argv){ if (argc != 2) { printf("Use example: %s www.google.com\n", *argv); return -1; } char *name = argv[1]; struct hostent *hptr; hptr = gethostbyname(name); if (hptr == NULL) { printf("gethostbyname error for host: %s: %s\n", name, hstrerror(h_errno)); return -1; } //输出主机的规范名 printf("\tofficial: %s\n", hptr->h_name); //输出主机的别名 char **pptr; char str[INET_ADDRSTRLEN]; for (pptr=hptr->h_aliases; *pptr!=NULL; pptr++) { printf("\ttalias: %s\n", *pptr); } //输出ip地址 switch (hptr->h_addrtype) { case AF_INET: pptr = hptr->h_addr_list; for (; *pptr!=NULL; pptr++) { printf("\taddress: %s\n", inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str))); } break; default: printf("unknown address type\n"); break; } return 0;}
编译:
g++ gethostbyname.cpp
运行:
与nslookup对比:
ps: gethostname可能存在性能瓶颈问题,请参考文章:http://blog.csdn.net/shijun_zhang/article/details/6577426
参考:《unix网络编程》·卷1
1 0
- gethostbyname()函数详解
- 域名获取IP地址【 gethostbyname()函数】详解
- gethostbyname函数
- gethostbyname函数
- gethostbyname函数
- gethostbyname函数
- 浅析gethostbyname函数
- 浅析gethostbyname函数
- Gethostbyname 函数介绍
- gethostbyname函数讲解
- GetHostbyName函数用法
- gethostbyname()函数说明
- gethostbyname()函数说明
- perl函数说明(gethostbyname )
- linux函数之gethostbyname
- gethostbyname函数调用失败
- gethostbyname()函数说明
- gethostbyname()函数的说明
- JSP之JSTl标签
- spring 在Thread中注入@Resource失败,总为null的解决方案
- [HihoCoder]#1342 : Full Binary Tree Picture
- servlet的三种创建模式
- 十大必备面试问题 你知道多少???
- gethostbyname()函数详解
- jquery父子隶属关系
- 开灯问题
- 中介者模式-C++实现
- Cocos2d-x3.0模版容器详解:cocos2d::Vector<T>
- 1368 - DNA Consensus String
- Servlet学习(三)doGet与doPost
- window下MySQL5.7.zip服务配置
- 类继承、虚继承