gethostbyaddr ,gethostbyname

转自:http://www.linuxidc.com/Linux/2012-07/65694p3.htm


网络主机名和IP地址的对应关系

在做网络编程时经常要碰到的一个问题就是根据对方主机名来获取其IP地址,或者根据IP地址反过来解析主机名和其他信息。Linux提供了两个常用的API:
struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const void *addr, int len, int type); 
这两个函数失败时返回NULL且设置h_errno错误变量,调用hstrerror(h_errno)或者herror("Error");可以得到详细的出错信息。成功时均返回如下结构:         


struct hostent {

     char    *h_name;        /* 主机名*/
     char    **h_aliases;    /* 主机别名的列表*/
     int     h_addrtype;     /* 地址类型,AF_INET或其他*/
     int     h_length;       /* 所占的字节数,IPv4地址都是4字节 */
     char    **h_addr_list;  /* IP地址列表,网络字节序*/
}


#define h_addr  h_addr_list[0]  /*后向兼容 */


gethostbyname可以将机器名(如www.google.com)转换为一个结构指针,gethostbyaddr可以将一个32位的IP地址(C0A80001)转换为结构指针。对于gethostbyaddr函数来说,输入参数“addr”的类型根据参数“type”来确定,目前type仅取AF_INET或AF_INET6。例如,type=2(即AF_INET),则addr就必须为struct in_addr{}类型。
继续看例子:       


#include <stdio.h>
#include <netdb.h>
#include <error.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 

int main(int arg,char** argv)

{

  struct hostent *host,*host2;
  if(NULL == (host = gethostbyname(argv[1]))){
          herror("Error");
          return 1;
  }

  printf("name = %s\n",host->h_name);
  printf("aliases = %s\n",*host->h_aliases);
  printf("add type = %d\n",host->h_addrtype);
  printf("len = %d\n",host->h_length);
  printf("IP=%s\n",inet_ntoa(*(struct in_addr*)host->h_addr));
  printf("=================================\n");


  struct in_addr maddr;

  if(0 == inet_aton(argv[2],&maddr))

{

          return 0;
  }

  char* c = (char*)&maddr;
  printf("org = %x.%x.%x.%x\n",*(c)&0xff,*(c+1)&0xff,*(c+2)&0xff,*(c+3)&0xff);

  if(NULL == (host2 = gethostbyaddr(&maddr,4,2))){
          printf("Error:%s\n",hstrerror(h_errno));
          return 1;
  }


  printf("name = %s\n",host2->h_name);
  printf("aliases = %s\n",*host2->h_aliases);
  printf("add type = %d\n",host2->h_addrtype);
  printf("len = %d\n",host2->h_length);
  printf("IP=%s\n",inet_ntoa(*(struct in_addr*)host2->h_addr));

  return 0;
}

当我们调用gethostbyaddr根据CU主页的IP地址获取其站点信息时返回的错误是“未知的主机”错误,原因留给大家自己思考吧。
这充分说明对了于gethostbyname()函数和gethostbyaddr()函数的调用一定要判断其返回值。


本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-07/65694p3.htm

博主:不过当我根据原来博客的主人那样测试 ping www.chinaunix.net 得到的ip,作为一个参数传递的时候,出错信息是:




不明白,具体原因是什么???


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值