我们现在认知一台计算机主机通常采用直观可读的名字。例如博客园我们会记住 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函数的更多相关文章

  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. android 实现QQ好友列表

    在某些Android开发群里,看到有些新手问怎么实现QQ好友列表,其实网上一搜挺多的.接触Android,也才一年的时间,大部分时间花在工作上(解bug...),界面上开发很少参与.自己维护的系统应用 ...

  2. UVA 624 CD(DP + 01背包)

    CD You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music i ...

  3. tail 命令(转)

    原文:http://www.cnblogs.com/peida/archive/2012/11/07/2758084.html ail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可 ...

  4. Java Lombok 减少代码冗余 get set

    1.下载 2.安装 java -jar Users\uatww990393\Desktop\lombok-1.16.16.jar a. 直接添加jar包到lib中  在java中项目中使用lombok ...

  5. 项目中用到的ext及js细节

    1.js中无replaceAll方法,但能够用replace(regex," "),第一个參数是正則表達式,第二个參数是string,eg:str.replace(/\r\n/g, ...

  6. webservice系统学习笔记1-使用注解创建ws服务

    简单入门之helloword,具体详细的在后面的章节详细介绍. 使用JDK自带的jax-ws创建并发布一个简单的webservice 在本地创建服务,然后本机访问 1.创建服务提供接口 IMyServ ...

  7. 安装mysql 和 apache

    一. 安装apache服务器 1. 检查apache服务器是否安装 #service httpd status 2. 如提示未被识别的服务,则表明组件未安装,需手动安装 #yum install ht ...

  8. 转:基于 linux 平台的 libpcap 源代码分析

    libpcap 是 unix/linux 平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础.Libpcap 可以在绝大多数类 unix 平台下工作,本文分析了 libpcap 在 linu ...

  9. js unique

    <script type="text/javascript"> var dataArr = [1,3,33,3,5,1,4,3,4,5]; document.write ...

  10. SQL Server因为数据库正在使用,所以无法获得对数据库的独占访问权

    恢复数据库: 恢复数据库之前,先执行下面这句话 ALTER DATABASE [mpn_stat] SET OFFLINE WITH ROLLBACK IMMEDIATE 执行恢复数据库SQL语句 R ...