学习笔记之gethostbyname函数
我们现在认知一台计算机主机通常采用直观可读的名字。例如博客园我们会记住 www.cnblogs.com 而不是记住42.121.252.58这个IP。对于大多数的应用程序来说应该是处理名字而不是处理地址。如果说对于一个点分十进制来说还好记住,那么当使用IPv6时,IP地址就不是那么好记了。
下面将介绍Linux下的一个函数 gethostbyname ,查找主机名最基本的函数。如果调用成功,它就返回一个指向hostent结构的指针,该结构中含有所查找主机的所有IPv4地址。这个函数的局限是只能返回IPv4地址,getaddrinfo函数是同时能处理IPv4和IPv6地址,不过这个不在讨论的范围。
函数的定义:
#include <netdb.h>
struct hostent * gethostbyname(const char * hostname); //返回:若成功则为非空指针,若出错则为NULL且设置h_errno
hostent 结构如下:
struct hostent{
char *h_name; /*official (canonical ) name of host*/
char **h_aliases; /*pointer to array of pointers to alias names*/
int h_addrtype; /*host address type:AF_INET*/
int h_length; /*length of address: 4*/
char **h_addr_list; /*ptr to array of ptrs with IPv4 addrs*/
};
h_name是正式的主机名,h_aliases是主机的别名。h_addrtype一般是AF_INET表示使用IP。h_length表示地址长度,而IPv4是4个字节。最后的h_addr_list表示地址对应的所有IP地址。(Ps:一个地址有多个IP对应,一般是用于负载吧,比如一个大型网站可能南方,北方,国外等不同的地方都有主机,不同的IPS也会有不同的IP,总之是很多情况。需要多个IP)。
一个调用gethostbyname并显示返回的信息的简单例子。
#include <stdio.h>
#include <arpa/inet.h>
#include <netdb.h> int main(int argc,char **argv)
{
char *ptr,**pptr;
char str[INET_ADDRSTRLEN];
struct hostent *hptr; while(--argc>)//判断参数的个数是否合法
{
ptr=*++argv;//取第一个参数及以后
if((hptr=gethostbyname(ptr))==NULL)//开始获取
{
printf("gethostbyname error for host: %s: %s\n",ptr,hstrerror(h_errno));//出错信息,并记录在h_error中
continue;
}
printf("official hostname: %s\n",hptr->h_name);//正式主机名 for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)//遍历所有的主机别名
printf("\talias: %s\n",*pptr); switch(hptr->h_addrtype)//判断socket类型
{
case AF_INET: //IP类为AF_INET
pptr=hptr->h_addr_list; //IP地址数组
for(;*pptr!=NULL;pptr++)
printf("\taddress: %s\n",
inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));//inet_ntop转换为点分十进制
break;
default:
printf("unknown address type\n");
break;
}
}
return ;
}
编译 gcc hostent.c -o hostent
那个Server: 202.96.134.133是本地的dns ,在/etc/resolv.conf 中。
程序在CentOS6.4中运行成功。参考UNP这本书。
本文地址:http://www.cnblogs.com/wunaozai/p/3753415.html
学习笔记之gethostbyname函数的更多相关文章
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- OpenCV 学习笔记03 findContours函数
opencv-python 4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...
- canvas学习笔记、小函数整理
http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- JavaScript:学习笔记(5)——箭头函数=>以及实践
JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...
- jQuery源代码学习笔记_工具函数_noop/error/now/trim
jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...
随机推荐
- Inside GDALAllRegister之四: 跳过driver
这个函数很短小: /** * \brief This method unload undesirable drivers. * * All drivers specified in the space ...
- Docker 安装使用
1:安装 在Linux上安装Docker,要求64位操作系统,并且内核版本需求为3.10以上,查看本机Linux内核版本: [root@localhost ~]# uname -r -.el7.x86 ...
- Linux操作系统安装与VMTools的安装
Linux操作系统安装:虚拟机+RedHat 1.安装虚拟机VMware_WorkstationV7.1.3 2.安装RedHat 自动安装(会自动安装VMTools): 打开虚拟机-->新建虚 ...
- Mac Oracle SqlDeveloper 快捷输入
用惯了 plsql 的快捷输入,换了 Mac Oracle SqlDeveloper反倒是找不到了,翻出去找了几次终于找到 SqlDeveloper -- preferences -- 数据库(dat ...
- POJ1679 The Unique MST 【次小生成树】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20421 Accepted: 7183 D ...
- Flash打开新窗口 被浏览器拦截问题 navigateToURL被拦截 真正试验结果
众所周知,打开新窗口以前经常被用作弹出广告用,而随着浏览器发展,现在估计除了ie6之外,基本都有广告拦截功能,最基本就是拦截这种非人为的弹出新窗口.我对js研究不深,我所了解就是,必须是用户操作的处理 ...
- SoapUI 测试接口演示
SoapUI 测试接口演示 CreateTime--2018年4月2日15:54:05 Author:Marydon 以webservice为例 1.安装: SoapUI-x64-5.4.0-E ...
- xtraTabbedMdiManager的标题上右鍵弹出关闭窗体菜单
实现一个增值功能, 在xtraTabbedMdiManager组件TabPage标题上右鍵弹出关闭当前窗体的菜单. C# Code: private void xtraTabbedMdiManager ...
- Linear Algebra Courses
Lecture 1:Demonstrate the columns of a matrix (imagine the vectors) in N-dimension space.How to mult ...
- 转载【TP3.2】:使用PHP生成二维码
转载:在网上down了一个二维码插件PHPQRcode,整合到了ThinkPHP 3.2.3,然后写了个外部自定义函数直接调用生成二维码,根据参数不同有不同尺寸效果,整合其实挺简单,分享给大家! 今天 ...