一,前言
这篇文章主要讲述了如何将域名如“www.baidu.com”转换为类似“127.0.0.1”的IP地址,转换的过程主要使用了DNS协议相关的内容,但我们的重点并不是这里,有兴趣的可自行了解。我主要讲的是如何使用,主要包括以下几个内容:
1,hostent结构体
2,gethostbyname函数的用法
以上内容全都是在Linux环境里。

二,详细内容
1,hostent结构体
struct hostent
{
char * h_name;
char ** alias_list;
int h_addrtype;
int h_length;
char ** h_addr_list;
};
h_name:主机的规范名,如“www.baidu.com”,它的规范名其实是“www.a.shifen.com”,这一点可以通过ping命令得到。

alisa_list:这是主机的别名,它是一个二级指针,这是因为主机的别名有可能有好几个。

h_addrtype:指主机的IP地址类型,到底是IPV4还是IPV6。

h_length:指主机的IP地址长度。

h_addr_list:它也是一个二级指针,它主要指向主机IP地址数组的指针,这是因为一个主机它的IP地址可能有多个,这也不难理解,如果你有多个网卡,你的IP地址自然也是有多个,但它们实际却都是指向你的。
另外还有一个定义h_addr它是一个指针,它指向h_addr_list[0],其实大部分时候我们只需要一个IP地址就够了,所以没必要知道那么多它的别名,需要注意的是这里的IP都是二进制的形式,它不是我们常见的点分十进制形式,所以如果直接打印可能会带来疑惑。
2,gethostbyname函数
它所在头文件:
sys/socket.h
netdb.h
//这里之所以不用include那种形式是因为带上‘#’markdown字体将会变大,所以见谅。
函数原型:
hosten* gethostbyname(const char* hostname);
它返回一个结构体的指针,如果没有找到“hostname”,将会返回NULL。
接下来请看其使用:
2.1

#include<stdio.h>
#include<netdb.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[]){char* ptr,**pptr;struct hostent* hptr;char str[32];ptr=argv[1];if((hptr=gethostbyname(ptr))==NULL){perror("gethostbyname");return -1;}printf("offical hostname:%s\n",hptr->h_name);for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++){printf("alias:%s\n",*pptr);}
pptr=hptr->h_addr_list;for(;*pptr!=NULL;pptr++){printf("address:%s\n",inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));}return 0;}

上述代码的功能主要是用户给定一个域名,然后打印出它的别名,以及它的所有IP地址。

其中inet_ntop函数是将网络字节序转为点分十进制形式。
请看运行结果:


经过编译之后,我们发现淘宝网的正式名称其实是那一长串,而它的别名才是我们熟悉的那个。
2.2 h_addr的使用
我们已经知道,h_addr是一个域名众多IP地址中的一个,但是因为它是二进制形式,所以在使用时是可以直接使用的,如下:

#include<stdio.h>
#include<netdb.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[]){//char* ptr,**pptr;struct hostent* hptr;//char str[32];ptr=argv[1];if((hptr=gethostbyname(ptr))==NULL){perror("gethostbyname");return -1;}
/* printf("offical hostname:%s\n",hptr->h_name);for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++){printf("alias:%s\n",*pptr);}
pptr=hptr->h_addr_list;for(;*pptr!=NULL;pptr++){printf("address:%s\n",inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));}*/struct in_addr myaddr;memcpy(&myaddr.s_addr,hptr->h_addr,sizeof(hptr->h_addr));printf("address:%s\n",inet_ntoa(myaddr));//printf("address:%s\n",inet_ntop(hptr->h_addrtype,ptr,str,sizeof(str)));return 0;}

结果:

三,结论
遇到困难,搞了半天才弄明白了,记录下来,方便自己,也留给需要的有缘人吧,综上。

如何将域名转换为ip相关推荐

  1. ios中域名转换为ip地址

    ios中域名转换为ip地址 2013-01-29 16:06 863人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. [cpp] view plaincopy #i ...

  2. 域名转换为IP地址示例

    一.前提条件 项目中增加对winsock的支持:在应用程序向导中勾选"Windows套接字"选项,也可以手工添加相关的*.h文件和代码实现. 二.编辑对话框资源,添加Button控 ...

  3. DNS这位“翻译官”是如何转换域名和IP地址的?

    DNS这位"翻译官"是如何转换域名和IP地址的? Linux就该这么学 1周前 DNS( Domain Name System)是"域名系统"的英文缩写,是一种 ...

  4. 主机名、域名、IP之间的关系

    使用ping命令,可以将域名转换为IP 域名可以被认为是主机在公网环境下的标识,主机名可以被认为主机在局域网中的标识. 在CentOS中,IP和域名.主机名的映射写在"/etc/host&q ...

  5. 域名和IP地址的联系

    什么是域名?什么是IP地址? 在Internet上有成千上万台主机,为了区分这些主机,每一台主机都被分配一个IP地址.但是由于IP地址难以记忆,因此有了方便记忆的域名. 域名由阿拉伯数字和英文字母.& ...

  6. 通过域名获取IP的整形格式,IP整形转换为字符串

    #include "stdafx.h" #include "windows.h" #pragma comment(lib,"ws2_32.lib&qu ...

  7. 获取指定域名的IP地址

    获取指定域名的IP地址 所需函数:gethostbyname 函数原型: struct hostent* gethostbyname(const char *name) 参数:const char * ...

  8. DNS(从域名到IP地址的对应)

    因特网上的主机可以使用多种方式进行标识.一种标识方法是用它的主机名,如cnn.com.www.yahoo.com等,这些名字便于记忆也乐于被人们接受.然而,主机名几乎没有提供关于主机在因特网中位置的信 ...

  9. java域名到ip转换_域名转化到IP地址的实现

    在linux中,有一些函数可以实现主机名和地址的转化,最常见的有gethostbyname().gethostbyaddr()等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化.其中geth ...

  10. python 域名转ip(多线程)

    将域名批量转换为ip地址.本文章没有做去重,有时间的自己去做个去重的小功能! import threading import time from concurrent.futures import T ...

最新文章

  1. 中计算散度的函数_理解 Kullback–Leibler 散度的近似
  2. 【MVC】Controller的使用
  3. toolchain安装教程支持_树莓派安装ESP8266_SDK开发环境
  4. linux下kill多个进程
  5. 开启MyBatis日志Sql打印
  6. G1 解决Evacuation Failure和Humongous Allocation
  7. mysql权限create细化_mysql权限精细化分配-阿里云开发者社区
  8. MySql error 2003 Can't connect to MySQL server on 'localhost' (0)
  9. SQL优化:你真的知道国家字符集的性能影响吗?
  10. 自由软件不够吸引人?
  11. 结束 Java、Python 之战,如何学习所有编程语言?
  12. linux如何正确关机,重启
  13. 微信小程序|小程序自定义底部导航栏
  14. matlab泊松分布图,matlab画泊松分布图
  15. CSI-RS资源配置
  16. leetcode 1033. Moving Stones Until Consecutive 解法 python
  17. 有价值项目分享,缺项目可直接搜索(持续更新中)
  18. python人脸识别库_基于Python的face_recognition库实现人脸识别
  19. 计算机行业热点的专业信息渠道,新南威尔士大学信息技术硕士专业详解 通往IT大神的必经之路...
  20. c语言海盗分1000个金币,海盗分金币问题及代码实现

热门文章

  1. 分享一大波高清电子元器件矢量图,速速下载收藏!
  2. 格式工厂kux格式怎么转换成mp4
  3. 中级网络工程师是什么?主要是考什么,有什么用?
  4. 5G关键技术之NFV
  5. 前端数据可视化之使用 canvas、svg、zrender画图
  6. 企业微信开发(1)——整体说明
  7. PDF密码强制解除——一键解除
  8. 信息系统集成监理费收取标准_信息系统工程监理与咨询服务收费参考标准起草说明...
  9. 第一篇:初识信息系统监理工程师
  10. python实现Kmeans算法