一、引言

域名,简单来理解就是我们平常说的网址。比如登录某度买假药时,会在IE浏览器的地址栏输入www.baidu.com,这里我们输入的就是百度的域名。而实际上我们在互联网中要找到某个网站,是需要这个网站的IP地址的,因为在网络中IP地址就是一台主机的联系地址,而通过域名寻找主机时,就需要先将域名转换成IP地址,这就是我们通常说的DNS服务器的作用。

二、通过域名获取IP地址

网络编程中,我们通过gethostbyname函数可以通过域名获取主机信息。所谓主机信息就是网络那头web服务器的信息,其中就包含该服务器的IP地址。gethostbyname的函数原型如下:

  1. #include <netdb.h>
  2. struct hostent *gethostbyname(const char *name);

它接收的唯一参数就是我们在浏览器中输入的域名,在前面的例子中也就是某度的url:www.baidu.com。而他的返回值是一个hostent类型的指针,该结构体的定义如下:

  1. struct hostent
  2. {
  3. char* h_name;
  4. char** h_aliases;
  5. int h_addrtype;
  6. int h_length;
  7. char** h_addr_list;
  8. }

h_name,存有官方域名。官方域名代表某一主页,但是一些公司的域名可能并未在官方域名注册。
h_aliases,存有其他域名。可以通过多个域名访问统一主页,同一IP可以绑定多个域名,出了官方域名外还可指定其他域名。这些信息可以通过h_aliases获得。
h_addrtype 保存的是h_addr_list中IP地址的类型。AF_INET表示IPv4类型的地址,AF_INET6表示IPv6类型的地址,这个大家应该很熟悉吧,就是我们在创建socket时采用的协议族类型。
h_length,保存的IP地址的长度。若是IPv4,因是4个字节,该值是4;若是IPv6,保存的是16个字节,该值是16;

h_addr_list,保存的是IP地址的列表。因为同一个域名可能分配给了多个IP地址,以缓解用户访问的压力,所以这里包含了多个IP地址。但是,值得注意的是,这里面保存的并不是字符串类型的IP地址,而是in_addr结构体变量的地址,也就是说h_addr_list实际上保存的是指针(为了兼容后续的IPv6d地址信息的指针,这里面的指针类型是char* ,而非in_addr*),指向了了in_addr结构体对象,而in_addr包含了IP地址信息。如果我们想要把in_addr结构体变成我们熟悉的点分十进制格式的IP地址,可以借助inet_ntoa()函数,用法请参照后面的例子。

下面是in_addr结构体的定义:

  1. strcut in_addr
  2. {
  3. in_addr_t s_addr; //32 位的IPv4地址
  4. }

接下来,是一个gethostbyname使用实例,我们来获取某度的IP地址:

  1. #include<unistd.h>
  2. #include<arpa/inet.h>
  3. #include<netdb.h>
  4. void error_handling(char *message);
  5. int main(int argc,char* argv[])
  6. {
  7. int i;
  8. struct hostent* host;
  9. if(argc!=2)
  10. {
  11. printf("Usage %s <port>",argv[0]);
  12. exit(1);
  13. }
  14. host=gethostbyname(argv[1]);
  15. if(!host)
  16. {
  17. error_handling("gethostbyname error");
  18. }
  19. printf("official name is %s\n",host->h_name);
  20. for(i=0;host->h_aliases[i];i++)
  21. {
  22. printf("Aliases %d: %s\n",i+1,host->h_aliases[i]);
  23. }
  24. printf("Address type: %s\n",
  25. host->h_addrtype==AF_INET?"AF_INET":"AF_INET6");
  26. for(i=0;host->h_addr_list[i];i++)
  27. {
  28. printf("IP addr %d: %s \n",i+1,
  29. inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
  30. }
  31. return 0;
  32. }
  33. void error_handling(char* message)
  34. {
  35. fputs(message,stderr);
  36. fputc('\n',stderr);
  37. exit(0);
  38. }

结果如下,发现该度设置了两个IP地址,分别是14.215.177.38和14.215.177.37.

我们在浏览器里可以直接输入ip地址来访问该度:

三、利用IP地址获取域名

想利用IP地址获取域名,使用gethostbyaddr函数:

  1. #include <netdb.h>
  2. ##include <sys/socket.h> /* for AF_INET */
  3. struct hostent *gethostbyaddr(const void *addr,
  4. socklen_t len, int type);

addr,指向in_addr结构体变量的指针。通过id地址获取in_addr结构体变量,相信大家都应该猜到了吧,就是inet_addr("14.215.177.37")。
len,输入的IP地址的长度,单位为字节,若是IPv4该值为4,若是IPv6该值为16
type,IP地址的类型,IPv4:AF_INET,IPv6:AF_INET6

我们再利用上面获得的ip地址获取百度的域名,使用实例如下:

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<unistd.h>
  5. #include<arpa/inet.h>
  6. #include<netdb.h>
  7. void error_handling(char *message);
  8. int main(int argc,char* argv[])
  9. {
  10. int i;
  11. struct hostent* host;
  12. struct sockaddr_in addr;
  13. if(argc!=2)
  14. {
  15. printf("Usage %s <port>",argv[0]);
  16. exit(1);
  17. }
  18. memset(&addr,0,sizeof(addr));
  19. addr.sin_addr.s_addr=inet_addr(argv[1]);
  20. host=gethostbyaddr((char*)&addr.sin_addr.s_addr,4,AF_INET);
  21. if(!host)
  22. {
  23. error_handling("gethostbyaddr error");
  24. }
  25. printf("official name is %s\n",host->h_name);
  26. for(i=0;host->h_aliases[i];i++)
  27. {
  28. printf("Aliases %d: %s\n",i+1,host->h_aliases[i]);
  29. }
  30. printf("Address type: %s\n",
  31. host->h_addrtype==AF_INET?"AF_INET":"AF_INET6");
  32. for(i=0;host->h_addr_list[i];i++)
  33. {
  34. printf("IP addr %d: %s \n",i+1,
  35. inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
  36. }
  37. return 0;
  38. }
  39. void error_handling(char* message)
  40. {
  41. fputs(message,stderr);
  42. fputc('\n',stderr);
  43. exit(0);
  44. }

结果:

原文地址:https://blog.csdn.net/hyman_c/article/details/52522606

IP地址和域名之间的转换相关推荐

  1. C# IP地址和整数之间的转换,IP地址和数字ip地址的转换

    IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...

  2. 计算机网络ip进制转换方法,IP地址与二进制之间的转换

    IP地址与二进制之间的转换 在讨论如何进行IP地址与二进制之间的转换前, 有必要解释一下IP地址与二进制的概念 IP IP协议是网络层的一个协议, 是能使连接到网上的所有计算机网络实现相互通信的一套规 ...

  3. IP地址与二进制之间的转换

    IP地址与二进制之间的转换 在讨论如何进行IP地址与二进制之间的转换前, 有必要解释一下IP地址与二进制的概念 IP IP协议是网络层的一个协议, 是能使连接到网上的所有计算机网络实现相互通信的一套规 ...

  4. IP地址与长整数之间的转换详解

    今天终于搞懂了ip地址和整数之间的转换, 在这里和大家分享一下心得,唠叨一把. 事件起因: 项目中用到通过ip地址获取城市名称,这样的原码网上一搜一大把,基本上都是lumaQQ的东西,在这里夸赞一番, ...

  5. java中IP地址与long之间的转换

    IP地址转为long型: public static long ipToLong(String ip) {String[] ipArray = ip.split("\\.");Li ...

  6. ip地址、域名、DNS、URL(即网址)的区别与联系

    原文出处:https://blog.csdn.net/paranoidyang/article/details/54288370 1.IP地址:每个连接到Internet上的主机都会分配一个IP地址, ...

  7. 网址(url),ip地址,域名,dns,hosts,服务器

    什么是服务器: 服务器最通俗的解释就是提供服务的机器 如何提供服务?提供什么服务?这很大程度上取决于用户了. 换一种说法,服务器也可以说成是一款性能更强,计算力更强的电脑.为什么这么说,因为电脑是用来 ...

  8. ip地址、域名、DNS、URL的区别与联系

    IP:每个连接到Internet上的主机都会分配一个IP地址,此ip是该计算机在互联网上的逻辑地址的唯一标识,计算机之间的访问就是通过IP地址来进行的.写法:十进制的形式,用"." ...

  9. C# 网络编程之获取本机名、ip地址、域名、物理位置

    在C#网络编程中,主机域名与ip之间能相互转换,同时DNS中有Dns类.IPHostEntry类.IPAddress类.DnsPermission类实现DNS的一些简单功能. 下面主要讲述一个C#的W ...

最新文章

  1. Android2.2 API 中文文档系列(7) —— ImageButton
  2. 【Android】3.22 示例22--LBS云检索功能
  3. HTML坐标不随着屏幕大小改变,HTML热区map坐标,随窗口大小自适应办法(javascript)...
  4. 引入静态变量_Common Lisp变量的一些事情
  5. 瑞星09年第一季度安全报告:8亿网民遭木马攻击
  6. python进行列联表卡方检验
  7. VS2010应用程序的打包与图标设置
  8. 分割视频的方法有哪些?
  9. 联想电脑关闭HotKey (热键模式),使用快捷功能时才需按Fn
  10. 用 Telegram bot 搭个消息提醒服务
  11. ArchieOpenGL教程扩展一:修改背景色颜色
  12. ShopNum1网店系统标准版常见问题总结
  13. 传奇人物《周兴和》书连载30 成功背后的陷阱
  14. 二维码的纠错码原理及如何纠错(2)
  15. DL之LSTM/GRU/CNN:基于tensorflow框架分别利用LSTM/GRU、CNN算法对上海最高气温(数据归一化+构造有监督数据集)实现回归预测案例
  16. CVBS/AHD 转换 BT656/BT601
  17. 12对胸椎对应体表标志_胸部体表标志详解.ppt
  18. 网络摄像头软件推荐Yawcam
  19. 怎么看服务器内存型号频率,如何看服务器内存频率
  20. 光盘自动运行:如何编写autorun文件

热门文章

  1. 2022-2028全球及中国葡萄种植市场研究报告
  2. L3-007 天梯地图
  3. 【Unity大气散射】GAMES104:3A中如何实现大气散射
  4. 零基础通过Ajax实现网易云音乐数据交互(4)
  5. hdu 4114 Disney's FastPass 状压dp
  6. 教你视频批量剪辑制作画中画效果
  7. 计算机鼠标不显示桌面,电脑开机后不显示桌面只有鼠标箭头,怎么回事
  8. 文章结构层次序数(序号)的规范要求
  9. PDM转换成Word文档或者XML文档
  10. 什么是大数据?如何成为大数据工程师?