java gethostbyname_gethostbyname

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

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

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

函数的定义:

1 1 #include

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

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

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

#include

2 #include

3 #include

4

5

6 int main(int argc,char **argv)7{8 char *ptr,**pptr;9 charstr[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_INET

28     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转换为点分十进制

//printf("\taddress: %s\n",

31     //inet_ntoa(*(struct in_addr*)pptr);//inet_ntoa转换为点分十进制

32     break;33   default:34     printf("unknown address type\n");35     break;36}37}38 return 0;39 }

编译 gcc hostent.c -o hostent

0823395d191059f42b7ad151fa639e78.png

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

参考UNP这本书。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值