博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习笔记之gethostbyname函数
阅读量:5377 次
发布时间:2019-06-15

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

  我们现在认知一台计算机主机通常采用直观可读的名字。例如博客园我们会记住 www.cnblogs.com 而不是记住42.121.252.58这个IP。对于大多数的应用程序来说应该是处理名字而不是处理地址。如果说对于一个点分十进制来说还好记住,那么当使用IPv6时,IP地址就不是那么好记了。

  下面将介绍Linux下的一个函数 gethostbyname ,查找主机名最基本的函数。如果调用成功,它就返回一个指向hostent结构的指针,该结构中含有所查找主机的所有IPv4地址。这个函数的局限是只能返回IPv4地址,getaddrinfo函数是同时能处理IPv4和IPv6地址,不过这个不在讨论的范围。

  函数的定义:

1 #include 
2 struct hostent * gethostbyname(const char * hostname); //返回:若成功则为非空指针,若出错则为NULL且设置h_errno

 

  hostent 结构如下:

1 struct hostent{2     char *h_name; /*official (canonical ) name of host*/3     char **h_aliases; /*pointer to array of pointers to alias names*/4     int h_addrtype; /*host address type:AF_INET*/5     int h_length; /*length of address: 4*/6     char **h_addr_list; /*ptr to array of ptrs with IPv4 addrs*/7 };

  h_name是正式的主机名,h_aliases是主机的别名。h_addrtype一般是AF_INET表示使用IP。h_length表示地址长度,而IPv4是4个字节。最后的h_addr_list表示地址对应的所有IP地址。(Ps:一个地址有多个IP对应,一般是用于负载吧,比如一个大型网站可能南方,北方,国外等不同的地方都有主机,不同的IPS也会有不同的IP,总之是很多情况。需要多个IP)。

  一个调用gethostbyname并显示返回的信息的简单例子。

1 #include 
2 #include
3 #include
4 5 6 int main(int argc,char **argv) 7 { 8 char *ptr,**pptr; 9 char str[INET_ADDRSTRLEN];10 struct hostent *hptr;11 12 while(--argc>0)//判断参数的个数是否合法13 {14   ptr=*++argv;//取第一个参数及以后15   if((hptr=gethostbyname(ptr))==NULL)//开始获取16   {17   printf("gethostbyname error for host: %s: %s\n",ptr,hstrerror(h_errno));//出错信息,并记录在h_error中18   continue;19   }20   printf("official hostname: %s\n",hptr->h_name);//正式主机名21 22   for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)//遍历所有的主机别名23   printf("\talias: %s\n",*pptr);24 25   switch(hptr->h_addrtype)//判断socket类型26   {27   case AF_INET: //IP类为AF_INET28     pptr=hptr->h_addr_list; //IP地址数组29     for(;*pptr!=NULL;pptr++)30     printf("\taddress: %s\n",31     inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));//inet_ntop转换为点分十进制32     break;33   default:34     printf("unknown address type\n");35     break;36   }37 }38 return 0;39 }

  编译 gcc hostent.c -o hostent

  

  那个Server: 202.96.134.133是本地的dns ,在/etc/resolv.conf 中。

  程序在CentOS6.4中运行成功。参考UNP这本书。

  

  本文地址: 

转载于:https://www.cnblogs.com/wunaozai/p/3753415.html

你可能感兴趣的文章
.net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类
查看>>
Exif的Orientation信息说明
查看>>
关于素数的快速查找——素数筛选法
查看>>
A strange lift HDU 1548
查看>>
gherkin
查看>>
js链式调用 柯里化
查看>>
SQL 2008 windows登录失败,错误18456, 更正
查看>>
HDU2665 Kth number 线段树 归并树
查看>>
nginx配置phpcms v9伪静态规则 phpcms伪静态 404 Not Found
查看>>
Lua xavante WEB server实现xmlrpc服务器端
查看>>
Python日期/时间操作方法使用
查看>>
(转)验证视图状态MAC失败的解决办法
查看>>
TCP/IP详解学习笔记
查看>>
计算机专业—毕业设计题目大全
查看>>
用Fmx调用Bass.dll
查看>>
数据结构 链表 c实现
查看>>
Hibernate里的增删改查实现代码笔记
查看>>
企业发展,扩张与财务报表
查看>>
surfingkeys
查看>>
记录一次从txt文件导入数据的python下的MySQL实现
查看>>