IP地址和域名之间的转换
一、引言
域名,简单来理解就是我们平常说的网址。比如登录某度买假药时,会在IE浏览器的地址栏输入www.baidu.com,这里我们输入的就是百度的域名。而实际上我们在互联网中要找到某个网站,是需要这个网站的IP地址的,因为在网络中IP地址就是一台主机的联系地址,而通过域名寻找主机时,就需要先将域名转换成IP地址,这就是我们通常说的DNS服务器的作用。
二、通过域名获取IP地址
网络编程中,我们通过gethostbyname函数可以通过域名获取主机信息。所谓主机信息就是网络那头web服务器的信息,其中就包含该服务器的IP地址。gethostbyname的函数原型如下:
- #include <netdb.h>
- struct hostent *gethostbyname(const char *name);
它接收的唯一参数就是我们在浏览器中输入的域名,在前面的例子中也就是某度的url:www.baidu.com。而他的返回值是一个hostent类型的指针,该结构体的定义如下:
- struct hostent
- {
- char* h_name;
- char** h_aliases;
- int h_addrtype;
- int h_length;
- char** h_addr_list;
- }
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结构体的定义:
- strcut in_addr
- {
- in_addr_t s_addr; //32 位的IPv4地址
- }
接下来,是一个gethostbyname使用实例,我们来获取某度的IP地址:
- #include<unistd.h>
- #include<arpa/inet.h>
- #include<netdb.h>
- void error_handling(char *message);
- int main(int argc,char* argv[])
- {
- int i;
- struct hostent* host;
- if(argc!=2)
- {
- printf("Usage %s <port>",argv[0]);
- exit(1);
- }
- host=gethostbyname(argv[1]);
- if(!host)
- {
- error_handling("gethostbyname error");
- }
- printf("official name is %s\n",host->h_name);
- for(i=0;host->h_aliases[i];i++)
- {
- printf("Aliases %d: %s\n",i+1,host->h_aliases[i]);
- }
- printf("Address type: %s\n",
- host->h_addrtype==AF_INET?"AF_INET":"AF_INET6");
- for(i=0;host->h_addr_list[i];i++)
- {
- printf("IP addr %d: %s \n",i+1,
- inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
- }
- return 0;
- }
- void error_handling(char* message)
- {
- fputs(message,stderr);
- fputc('\n',stderr);
- exit(0);
- }
结果如下,发现该度设置了两个IP地址,分别是14.215.177.38和14.215.177.37.
我们在浏览器里可以直接输入ip地址来访问该度:
三、利用IP地址获取域名
想利用IP地址获取域名,使用gethostbyaddr函数:
- #include <netdb.h>
- ##include <sys/socket.h> /* for AF_INET */
- struct hostent *gethostbyaddr(const void *addr,
- 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地址获取百度的域名,使用实例如下:
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- #include<unistd.h>
- #include<arpa/inet.h>
- #include<netdb.h>
- void error_handling(char *message);
- int main(int argc,char* argv[])
- {
- int i;
- struct hostent* host;
- struct sockaddr_in addr;
- if(argc!=2)
- {
- printf("Usage %s <port>",argv[0]);
- exit(1);
- }
- memset(&addr,0,sizeof(addr));
- addr.sin_addr.s_addr=inet_addr(argv[1]);
- host=gethostbyaddr((char*)&addr.sin_addr.s_addr,4,AF_INET);
- if(!host)
- {
- error_handling("gethostbyaddr error");
- }
- printf("official name is %s\n",host->h_name);
- for(i=0;host->h_aliases[i];i++)
- {
- printf("Aliases %d: %s\n",i+1,host->h_aliases[i]);
- }
- printf("Address type: %s\n",
- host->h_addrtype==AF_INET?"AF_INET":"AF_INET6");
- for(i=0;host->h_addr_list[i];i++)
- {
- printf("IP addr %d: %s \n",i+1,
- inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
- }
- return 0;
- }
- void error_handling(char* message)
- {
- fputs(message,stderr);
- fputc('\n',stderr);
- exit(0);
- }
结果:
原文地址:https://blog.csdn.net/hyman_c/article/details/52522606
IP地址和域名之间的转换相关推荐
- C# IP地址和整数之间的转换,IP地址和数字ip地址的转换
IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...
- 计算机网络ip进制转换方法,IP地址与二进制之间的转换
IP地址与二进制之间的转换 在讨论如何进行IP地址与二进制之间的转换前, 有必要解释一下IP地址与二进制的概念 IP IP协议是网络层的一个协议, 是能使连接到网上的所有计算机网络实现相互通信的一套规 ...
- IP地址与二进制之间的转换
IP地址与二进制之间的转换 在讨论如何进行IP地址与二进制之间的转换前, 有必要解释一下IP地址与二进制的概念 IP IP协议是网络层的一个协议, 是能使连接到网上的所有计算机网络实现相互通信的一套规 ...
- IP地址与长整数之间的转换详解
今天终于搞懂了ip地址和整数之间的转换, 在这里和大家分享一下心得,唠叨一把. 事件起因: 项目中用到通过ip地址获取城市名称,这样的原码网上一搜一大把,基本上都是lumaQQ的东西,在这里夸赞一番, ...
- java中IP地址与long之间的转换
IP地址转为long型: public static long ipToLong(String ip) {String[] ipArray = ip.split("\\.");Li ...
- ip地址、域名、DNS、URL(即网址)的区别与联系
原文出处:https://blog.csdn.net/paranoidyang/article/details/54288370 1.IP地址:每个连接到Internet上的主机都会分配一个IP地址, ...
- 网址(url),ip地址,域名,dns,hosts,服务器
什么是服务器: 服务器最通俗的解释就是提供服务的机器 如何提供服务?提供什么服务?这很大程度上取决于用户了. 换一种说法,服务器也可以说成是一款性能更强,计算力更强的电脑.为什么这么说,因为电脑是用来 ...
- ip地址、域名、DNS、URL的区别与联系
IP:每个连接到Internet上的主机都会分配一个IP地址,此ip是该计算机在互联网上的逻辑地址的唯一标识,计算机之间的访问就是通过IP地址来进行的.写法:十进制的形式,用"." ...
- C# 网络编程之获取本机名、ip地址、域名、物理位置
在C#网络编程中,主机域名与ip之间能相互转换,同时DNS中有Dns类.IPHostEntry类.IPAddress类.DnsPermission类实现DNS的一些简单功能. 下面主要讲述一个C#的W ...
最新文章
- Android2.2 API 中文文档系列(7) —— ImageButton
- 【Android】3.22 示例22--LBS云检索功能
- HTML坐标不随着屏幕大小改变,HTML热区map坐标,随窗口大小自适应办法(javascript)...
- 引入静态变量_Common Lisp变量的一些事情
- 瑞星09年第一季度安全报告:8亿网民遭木马攻击
- python进行列联表卡方检验
- VS2010应用程序的打包与图标设置
- 分割视频的方法有哪些?
- 联想电脑关闭HotKey (热键模式),使用快捷功能时才需按Fn
- 用 Telegram bot 搭个消息提醒服务
- ArchieOpenGL教程扩展一:修改背景色颜色
- ShopNum1网店系统标准版常见问题总结
- 传奇人物《周兴和》书连载30 成功背后的陷阱
- 二维码的纠错码原理及如何纠错(2)
- DL之LSTM/GRU/CNN:基于tensorflow框架分别利用LSTM/GRU、CNN算法对上海最高气温(数据归一化+构造有监督数据集)实现回归预测案例
- CVBS/AHD 转换 BT656/BT601
- 12对胸椎对应体表标志_胸部体表标志详解.ppt
- 网络摄像头软件推荐Yawcam
- 怎么看服务器内存型号频率,如何看服务器内存频率
- 光盘自动运行:如何编写autorun文件