如何通过域名获取主机ip地址
如何通过域名获取主机ip地址
需要注意,主机
不是本机,一般指服务器与客户端。主机信息主要包含ip地址
和对应的域名
。linux使用结构体struct hostent
表示主机的信息。struct hostent
各个成员的含义如下:
struct hostent
{char *h_name; //主机名,即官方域名,规范域名char **h_aliases; //主机所有别名构成的字符串数组,同一IP可绑定多个域名。最后以一个字符串为NULL,用于判断数组的结束。int h_addrtype; //主机IP地址的类型.要么是AF_INET(IPV4),要么是AF_INET6(IPV6).int h_length; //主机IP地址长度,IPV4地址为4,IPV6地址则为16char **h_addr_list;//域名对应ip地址表,以网络字节序存储。最后一个数组的指针为NULL,用来判断数组的结束。即h_addr_list[n] == NULL。若要打印出这个IP,需要调用inet_ntoa()。
};
下面是获取主机信息的相关函数,使用时需要包含netdb.h
:
struct hostent *gethostbyname(const char *name)
- 通过域名(如"www.baidu.com")获取IP地址详细信息。此函数多线程不安全,建议使用gethostbyname_r()函数代替。
- name:域名字符串。
- 成功返回信息体指针。失败返回NULL.失败时可以通过全局变量
h_errno
查看具体原因。
struct hostent *gethostbyname2(const char *name, int af)
- 功能类似gethostbyname().但是调用者可以指定地址族。此函数多线程不安全,建议使用gethostbyname2_r()函数代替。
- af:指定地址族。要么是AF_INET(IPV4),要么是AF_INET6(IPV6)
struct hostent *gethostbyaddr(const void *addr,socklen_t len, int type)
- 通过地址来获取IP地址的详细信息。此函数多线程不安全,建议使用gethostbyaddr_r()函数代替。
- addr:ip数值地址(大端格式)。一般用inet_aton()函数来生成。
- len:addr的字节数。即如果是IPv4,则为4四个字节.
- type:指定地址的格式。要么是AF_INET(IPV4),要么是AF_INET6(IPV6)。
- 成功返回信息体指针。失败返回NULL.失败时可以通过全局变量
h_errno
查看具体原因。
int gethostbyname_r(const char *name,struct hostent *ret, char *buf, size_t buflen,struct hostent **result, int *h_errnop)
- 是gethostbyname()的升级版本。多线程安全。功能和gethostbyname()类似。
- ret:如果获取成功,相关信息会填充到此结构体。
- buf:函数的临时工作buff.
- buflen:buf的长度。
- result:如果成功,会指向转换后的结果指针。失败返回0.
- h_errnop:存储错误码。
- return:成功返回0.失败返回错误码,如果为ERANGE,表示buf大小不够。
int gethostbyname2_r(const char *name, int af,struct hostent *ret, char *buf, size_t buflen,struct hostent **result, int *h_errnop)
- 功能和参数gethostbyname_r()相似。
int gethostbyaddr_r(const void *addr, socklen_t len, int type,struct hostent *ret, char *buf, size_t buflen,struct hostent **result, int *h_errnop)
- 参数含义参看gethostbyname_r()。功能参看gethostbyaddr().
下面是函数使用例程:
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
void main(void)
{struct hostent *pInfo = NULL;pInfo = gethostbyname("www.baidu.com");printf("%d ",pInfo->h_length);printf("%d ",pInfo->h_addrtype);printf("%s\n",pInfo->h_name);//主机域名
printf("别名:");for(int i = 0; pInfo->h_aliases[i];i++){//打印别名表printf("%s ",pInfo->h_aliases[i]);}printf("\nip地址:");for(int i = 0; pInfo->h_addr_list[i];i++){//打印ip地址表printf("%s ",inet_ntoa(*(struct in_addr*)pInfo->h_addr_list[i])); }
struct hostent *hp;
size_t hstbuflen;char *tmphstbuf;int res;int herr; pInfo = malloc (sizeof (struct hostent));hstbuflen = 1024;tmphstbuf = malloc (hstbuflen);res = gethostbyname_r("www.baidu.com",pInfo,tmphstbuf,hstbuflen,&hp,&herr);printf("%s\n",pInfo->h_name);printf("%s\n",hp->h_name);
}
除此之外,本机主机在/etc/hosts
的主机数据库文件中保存了一个主机名查询静态表。可以使用命令cat /etc/hosts
查看。它是Linux系统上一个负责ip地址与域名快速解析的文件。hosts文件包含了ip地址与主机名之间的映射,还包括主机的别名。在没有域名解析服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的ip地址,否则就需要使用dns服务程序来查找。可以通过将常用的域名和ip地址映射加入到hosts文件中,实现快速方便的访问。系统查询域名的优先级为dns缓存 > hosts文件 > dns服务
.除此之外,也可以使用下面的函数在程序中查看映射表。
void sethostent(int stayopen)
- 打开数据库,并设置起始值。
struct hostent *gethostent(void)
- 获取主机数据库中的下一个条目。
void endhostent(void)
- 关闭主机数据库。
下面是数据库查看的使用例程:
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>
void main(void)
{struct hostent *pInfo = NULL;sethostent(0);int index = 0;while(1){pInfo = gethostent();if(pInfo == NULL){break;}printf("-----------%2d------------\n",++index);printf("%s\n",pInfo->h_name);printf("别名:");for(int i = 0; pInfo->h_aliases[i];i++){printf("%s ",pInfo->h_aliases[i]);}printf("\nip地址:%d ",pInfo->h_addrtype);char strbuf[32];for(int i = 0; pInfo->h_addr_list[i];i++){const char *pStr = inet_ntop(pInfo->h_addrtype,pInfo->h_addr_list[i],strbuf,32);if(pStr){printf("%s ",pStr);}}printf("\n");}endhostent();
}
如何通过域名获取主机ip地址相关推荐
- Java 获取主机ip地址(ipv4)
在java 应用中, 有时需要获取应用所在服务器的ip地址, 比如说利用Zookeeper 做动态节点上下线时. java 提供了InetAddress 类来获取主机ip地址, 但是使用的时候需要注意 ...
- JAVA获取主机IP地址
JAVA获取主机IP地址 java 获取主机IP地址工具类 import org.springframework.web.context.request.RequestAttributes; impo ...
- MFC获取主机IP地址
CString GetHostAddress(void) { CString local_addr; WSADATA wsadata; if (0 != WSAStartup(MAKEWORD(2, ...
- Python获取局域网内可连通的主机ip地址
使用python来获取整个局域网内可以连通的主机ip地址: 整体是思路就是 1.先获取我本机的ip地址 2.拿到我本机ip后,截取ip的最后一段,保留前一部分网段信息 3.调用cmd命令,循环从1循环 ...
- 关于如何实现外网访问本地主机IP地址(natapp)。(如何实现将外网可访问的域名与本地主机IP地址绑定)
背景介绍 最近在跟着网上学习微信支付接口的异步通知,其中,微信需要将支付成功的消息通过接口传递给本地主机,即需要提供一个外网可访问的本地主机地址.具体如下: 由于还停留在测试阶段,我们不能直接部署该代 ...
- python获取域名对应的ip_09python实现DNS查找域名对应的IP地址
# DNS:是一个UDP层上边的协议,用于将域名转换成IP地址,在我们平时浏览网页的时候, # 这个我们平时用到的特别多的,在我们打开浏览器进行搜索网页的时候,不是填入IP地址进行 # 搜索的,而只是 ...
- Linux下编程获取本地IP地址的常见方法
代码编译运行平台:Linux 64bits+g++(-m64),-m64表示生成64bits的程序. 在进行Linux网络编程时,经常用到本机IP地址.本文罗列一下常见方法,以备不时之需. 获取本机I ...
- JavaWeb中如何通过Request对象获取客户端IP地址
提供一个获取ip地址的工具类 package com.leo.util; import org.apache.logging.log4j.LogManager; import org.apache.l ...
- php获取ip几种方法区别,php获取客户端IP地址的几种方法
php获取客户端IP地址的几种方法 阅读php获取客户端IP地址的几种方法, 1:来看看代码: echo "(1)浏览当前页面的用户的 IP 地址为:"; echo $_SERVE ...
最新文章
- Oracle10g 回收站及彻底删除table : drop table xx purge
- 设计模式(四)--代理模式
- ​一网打尽 Linux 必备技能,就靠它了!
- python 点滴记录1:python没有Tkinter模块
- 手机app上的consent管理
- Python __slots__ 作用
- 阿里巴巴代码平台架构的演进之路
- 深入理解JavaScript系列:This? Yes,this!
- 统计学基础学习笔记:概率与概率分布
- chrome 设置user agent
- python tracer函数_Python流程控制常用工具和函数定义
- Bailian3468 电池的寿命【贪心】
- Luogu1095 守望者的逃离
- RemObjects SDK 简介
- 如何使用OBS录制采集卡视频内容
- 移动通信技术的未来发展趋势分析
- 【2020GAN】对抗生成网络论文收录(1月-6月)
- 什么是SCSI硬盘?
- 【基础知识①】计算机网络知识
- 思科交换机密码清除方法记录