刚才学了gethostbyname函数,这个gethostbyaddr函数的作用是通过一个IPv4的地址来获取主机信息,并放在hostent结构体中。

#include <netdb.h>
struct hostent * gethostbyaddr(const char * addr, socklen_t len, int family);//返回:若成功则为非空指针,若出错则为NULL且设置h_errno
//上面的const char * 是UNP中的写法,而我在linux 2.6中看到的是 const void *

  本函数返回一个指向hostent结构指针。addr参数实际上不是char * 类型,而是一个指向存放IPv4地址的某个in_addr结构的指针;len参数是这个结构的大小,对于IPv4地址为4;family参数为AF_INET。

  先不多说,先给出代码 (CentOS 6.4)

 #include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h> int main(int argc,char **argv)
{
char *ptr,**pptr;
char str[INET_ADDRSTRLEN];
struct hostent *hptr;
struct in_addr * addr;
struct sockaddr_in saddr; //取参数
while(--argc>)
{
  ptr=*++argv; //此时的ptr是ip地址
  if(!inet_aton(ptr,&saddr.sin_addr)) //调用inet_aton(),将ptr点分十进制转in_addr
  {
  printf("Inet_aton error\n");
  return ;
  }   if((hptr=gethostbyaddr((void *)&saddr.sin_addr,,AF_INET))==NULL) //把主机信息保存在hostent中
  {
  printf("gethostbyaddr error for addr:%s\n",ptr);
  printf("h_errno %d\n",h_errno);
  return ;
  }
  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
  case AF_INET6: //IP类为AF_INET6
    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 ;
}

  从代码中可以看到,gethostbyaddr的第一个参数是sockaddr_in而不是in_addr类型。我做实验的时候用in_addr作为参数,总是不行,也不知道为什么。就将就用了sockaddr_in了。

  然后我 编译后运行

  ./gethostbyaddr 127.0.0.1  完美的成功了,正当高兴的时候。

  ./gethostbyaddr 115.239.211.110 (百度域名的ip)

  竟然出错了,是gethostbyaddr error for addr:115.239.211.110 而h_errno是为2的。

  就找到了这一篇文章:https://community.oracle.com/thread/1926589?start=0&tstart=0

  我改了 /etc/resolv.conf 增加了一个 nameserver 8.8.8.8

  再次运行,又错了,这次的错误代码是h_errno=1。

  于是就又找到了这一篇文章:http://kb.zmanda.com/article.php?id=139

  什么,竟然要手动在/etc/hosts下增加?算了,就先试一下。写上 115.239.211.110 www.baidu.com ,运行,成功了。

  ---------------------------------------------------------------------------

  正在想为什么会这样的时候,看到UNP里面的一句话: 按照DNS的说法,gethostbyaddr在in_addr.arpa域中向一个名字服务器查询PTR记录。

  可能是我的电脑不是服务器吧,没有域名解析服务吧。所以不行。而本地的/etc/hosts差不多就是有这个功能。我就在想为什么gethostbyname会向/etc/hosts文件中查看信息,然后没有对应的话,就会返回上一级的DNS进行解析。而反向解析为什么不会自动解析呢?(Ps我想会不会是反向解析比较少用到,而且正向解析域名有层次关系,而IP没有层次关系,不方便处理吧。)我通过nslookup 115.239.211.110 进行查询时提示这个错误:

** server can't find 110.211.239.115.in-addr.arpa.: NXDOMAIN

  好了,没错了,要使用这个函数,本地要有反向解析的服务。

  本文地址:http://www.cnblogs.com/wunaozai/p/3753731.html

学习笔记之gethostbyaddr函数的更多相关文章

  1. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  2. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  3. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  5. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  6. canvas学习笔记、小函数整理

    http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...

  7. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

  8. JavaScript:学习笔记(5)——箭头函数=>以及实践

    JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...

  9. jQuery源代码学习笔记_工具函数_noop/error/now/trim

    jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...

随机推荐

  1. PHP MySQL -处理语句

    PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预 ...

  2. 查找树ADT——二叉查找树

    二叉查找树:对于树中的每个节点X,它的左子数种所有关键字值小于X的关键字,而它的右子树种所有关键字值大于X的关键字值. /* 二叉查找树声明 */ #ifndef _TREE_H struct Tre ...

  3. centos下两种方法安装git

    来自:http://blog.slogra.com/post-176.html 今天下个包需要使用git,网上找了下看到大多数只有编译安装,并且编译安装还有错,不知道他们也没有实验过,这里我来给大家介 ...

  4. hdu 4865 Peter&#39;s Hobby(概率dp)

    http://acm.hdu.edu.cn/showproblem.php? pid=4865 大致题意:有三种天气和四种叶子状态.给出两个表,各自是每种天气下叶子呈现状态的概率和今天天气对明天天气的 ...

  5. 算法笔记_111:第五届蓝桥杯软件类省赛真题(Java本科A组)试题解答

     目录 1 猜年龄 2 李白打酒 3 神奇算式 4 写日志 5 锦标赛 6 六角填数 7 绳圈 8 兰顿蚂蚁 9 斐波那契 10 波动数列   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路 ...

  6. 设置Treeview背景色的问题1

    有没有哪位兄弟在VB中使用sendmessage对TreeView改变背景色?我现在遇到一个问题,如果把linestyle设为1 的时候,展开节点的时候root部位会 有一个下拉的白色块,如果设为1  ...

  7. C#时间戳转换[转发]

    http://www.cnblogs.com/qingliuyu/p/3835858.html 以下是C#下的日期与unix时间戳的相互转换: /// <summary> /// 日期转换 ...

  8. 【BIEE】导出数据报错

    使用BIEE导出数据的时候,发现个问题,导出过程中,报错如下: 问题解决: 找到文件opmn.xml,路径为:/Middleware/instances/instance1/config/OPMN/o ...

  9. 去除DataTable重复数据的三种方法(转)

    转自:https://www.cnblogs.com/sunxi/p/4767577.html 业务需求 最近做一个把源数据库的数据批次导出到目标数据库.源数据库是采集程序采集而来的原始数据库,所以需 ...

  10. c中的static

    static的作用 1)保持变量值:在函数体,一个被声明为静态的变量在这一函数中可以维持其值.这句话可能描述不太准确,大家看下面这个例子吧. void staticLocalVar() { stati ...