前言:

网络编程是程序连接网络拓展的基础,尤其是在物联网、互联网加等概念火热的当下,网络编程能力体现了一个程序员能否具有大型程序的开发能力。这里通过详细例子解析hostent结构体,hostent是C语言标准库函数gethostbyname的返回值,gethostbyname是用来解析域名的重要函数,在程序的网络应用中经常需要将域名转换为IP地址,然后建立Socket与服务器进行数据交互。

hostent

struct hostent
{  char *h_name;         //正式主机名  char **h_aliases;     //主机别名  int h_addrtype;       //主机IP地址类型:IPV4-AF_INET  int h_length;         //主机IP地址字节长度,对于IPv4是四字节,即32位  char **h_addr_list;   //主机的IP地址列表
}; 

使用hostent需要包含#include<netdb.h>和#include<sys/socket.h>等头文件,结构体hostent有五个元素,即h_name,它是一个字符指针,指向主机名;h_aliases是一个二重指针,指向主机的别名,一个主机可以有多个别名,h_aliases可以用下标的方式访问不同的主机别名;h_addrtype,为int型数据,指定主机使用的IP地址类型;length指定IP地址长度;h_addr_list也是一个二重指针,与h_aliases一样,也可以通过下标进行访问。它指定主机的不同IP地址,在实际的应用中,一台服务器往往有好几个IP地址,而域名只有一个,这样设计的好处是,可以使系统分布设计,提升服务器的稳定性和抗灾难能力。一般对服务器的访问,则是先经过DNS服务器,DNS通过均衡设计,返回合适的IP与客户端进行交互,避免客户端只连接一个IP,导致网络拥堵。

hostent实例

不多说,直接上源码

#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>int main(int argc, char** argv)  {  struct hostent *host = NULL;char **pptr; char domain[1024]={0};   if(argc != 2){printf("Usage: hostname <domain>\n");exit(0);}   memset(domain,0,sizeof(domain));sprintf(domain,"%s",argv[1]);if((host = gethostbyname(domain)) == NULL || host->h_addr_list == NULL || host->h_addr_list[0] == NULL){printf("can't parse the domain\n");exit(0);      }else{printf("official hostname:%s\n",host->h_name);for(pptr = host->h_aliases; *pptr != NULL; pptr++)printf("alias:%s\n",*pptr);switch(host->h_addrtype)  {   case AF_INET:   case AF_INET6:pptr = host->h_addr_list;  for(; *pptr!=NULL; pptr++)printf("address:%s\n",inet_ntop(host->h_addrtype, *pptr, domain,64));printf("first address: %s\n",inet_ntop(host->h_addrtype, host->h_addr,domain,64));              break;default:printf("Unkown address type\n");}}return 0;} 

我们用百度来试试效果:

可见,我们成功或取到了百度的IP地址,此时将IP地址输入到浏览器就能看到我们熟悉的百度搜索框。下面再试试头条,看看解析获取到的IP地址是什么。

可以看到,解析到头条的IP地址有很多个,我们拿其中一个复制到浏览器,此时并没有获取到头条的首页,是不是我们解析错了呢,其实不然,绝大数的网站都不支持IP访问,只能通过域名,这是因为一般的网站会选择放在虚拟主机,且在主机上放置了很多个网站,而每个网站绑定1个或以上域名,虚拟主机上,例如Apache主机的配置会将对应的ip解析到对应的网站目录的,实现一台服务器上配置多个站点;一般用户在访问的时候,会产生一个http请求报文,上面的host信息可以提供给服务器,告诉服务器要访问的域名,从而实现一台主机绑定一个IP,即使有多个网站,也不会相互干扰。但使用IP访问,主机不知道用户访问的具体目录,请求便会出现错误。

总结

物联网、互联网加的蓬勃发展,产品的功能实现越来越依赖网络,掌握一些网络编程的小技巧,可以使得我们在产品开发中能够事半功倍,提升软实力。今天是5月20日,在特殊的日子里整理一下知识,以做备忘,原创不易,转载说明出处。

文献参考:

https://www.aliyun.com/jiaocheng/119490.html

https://www.cnblogs.com/engeng/p/5968915.html

hostent实例详解相关推荐

  1. java异常例子_java 异常的实例详解

    java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...

  2. python 自动化办公 案例_python自动化工具之pywinauto实例详解

    python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...

  3. java写exe程序实例,java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...

  4. python多进程应用场景_python使用多进程的实例详解

    python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...

  5. php可以打印一个页面,利用html实现分页打印功能的实例详解

    本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的. 页面打印 /* 应用这个样式的在打印时隐藏 */ .noPrint { d ...

  6. python判断是否回文_对python判断是否回文数的实例详解

    设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...

  7. python2.7除法_对python中的float除法和整除法的实例详解

    从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...

  8. java测试类 main方法_Java使用agent实现main方法之前的实例详解

    Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...

  9. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

最新文章

  1. 三分钟,了解PLM真谛
  2. HBase总结(十二)Java API 与HBase交互实例
  3. zookeeper清空hbase_Ambari 管理hadoop、hbase、zookeeper节点
  4. 通向架构师的道路(第十二天)之Axis2 Web Service(三)
  5. white-space、over-flow、text-overflow
  6. Beta冲刺 day4
  7. 关于synergy的问题
  8. PostgreSQL是否区分大小写
  9. GJB六性设计---环境适应性实验
  10. Linux vi 替换字符串
  11. CS229 Lecture 20
  12. android模拟程序被杀死,Android模拟后台进程被杀
  13. (附源码)springboot社区养老医疗服务平台 毕业设计 041148
  14. 利用Matlab对Excel数据表参数进行频谱分析(FFT)的方法
  15. 首都经贸大学计算机科学与技术专业,河北经贸大学经济管理学院的计算机科学与技术专业怎么样啊...
  16. mysql官方系在教程_MySQL系列教程(四)
  17. python os popen_【转】python os.popen 超时问题
  18. 13.集合框架ListSet
  19. 全极化SAR图像freeman分解
  20. win7 台式机建热点

热门文章

  1. prometheus+alertmanager 企业微信告警
  2. linux 桌面 v2ex,程序员:他人笑我桌面太凌乱,我笑他人看不穿
  3. (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法...
  4. 点击地图获取经纬度(基于腾旭地图api)
  5. vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式
  6. vscode markdown 导出PDF错误
  7. oracle load 用法,Oracle中SQL*LOADER使用方法总结
  8. Chrome 谷歌分页打印 去除页眉页脚 点击取消或打印关闭当前窗口
  9. 几何光学学习笔记(12)- 3.9几种典型系统的理想光学系统性质 3.10 矩阵运算在几何光学中的应用
  10. thinkpad重装系统不引导_联想Y400电脑装WIN7无法重装系统的解决方法