获取指定域名的IP地址

获取指定域名的IP地址

所需函数:gethostbyname

函数原型:

struct hostent* gethostbyname(const char *name)

参数:const char *name  //主机名或域名

返回值:函数执行成功会返回一个hostent结构体,其结构体原型如下:

struct hostent

{

char *h_name;//主机正式名

char ** h_aliases;//主机别名

short h_addrtype;//主机地址类型一般为2表示是AF_INET

short h_length;//地址长度,32位地址长度为4个字节

char ** h_addr_list; //存储主机地址的数组。此处要注意的是该成员可以存储多个IP地址,即如其名称所言,地址列表。当获取到hostent结构指针后,要读取地址信息。应该使用

      强制转换为in_addr*(用来表示IV_4IP的TCP结构体)再使用。我刚开始使用的时候以为每个h_addr_list[i]就是一个地址列表的字符,结果得到的不是自己想要的。

};

函数执行失败会返回一个空指针,并且可以通过WSAGetLastError来获取错误码

WSANOTINITIALISED 在应用这个API前,必须成功地调用WSAStartup()。

WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。

WSAHOST_NOT_FOUND 没有找到授权应答主机。

WSATRY_AGAIN 没有找到非授权主机,或者SERVERFAIL。

WSANO_RECOVERY 无法恢复的错误,FORMERR,REFUSED,NOTIMP。

WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。

WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。

WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了.

示例:

#include 

#pragma comment(lib,"WS2_32.lib")           //套接字库

int main(){

WSAData wsa;

WSAStartup(MAKEWORD(2, 2)/*使用2.2的winsock版本库*/, &wsa);

hostent *phst = gethostbyname("www.Google.com");//传递域名/主机名

in_addr * iddr = (in_addr*)phst->h_addr;//h_addr = h_addr_list[0],获取地址列表第一个地址IP

unsigned long IPUL = iddr->s_addr;//获取无符号的网络字节序,该符号通常以大端形式存储

char *IP = inet_ntoa(*iddr);//将十进制的大端存储的网络字节讯转化为以.分割的字符IP_4地址,并以小端形式存储

printf("%s", IP);//打印

getchar();

}

 

运行结果:

获取指定域名的IP地址_第1张图片

有的时候你会发现你能获取某个网站的IP地址时能获取到多个IP地址,就像h_addr_list这个成员变量一样,这里来说明一下,DNS服务器,DNS服务器是负责用于解析某个域名的IP的,它会把解析结果返回给浏览器,浏览器在通过解析结果,来进行TCP/IP的连接,那么DNS服务器是什么?

DNS服务器是由ICANN(全球互联网域名与数字地址(IP)分配机构)维护的,后ICANN将亚太地区(亚洲大陆)DNS服务器交给apnic维护,并且其它大陆的也分别交给不同的信息中心维护,美国是由ICANN维护的,但其资源是共享的,我们平常在一些域名供应商购买域名时,通过域名捆绑IP时供应商会将这些信息通过信息中心提供的结构解析到信息中心中!

且域名也是有ICANN维护的,我们平常在注册域名都要查一下域名是否被注册,这些都是通过ICANN提供的接口查询的,并且不同国家也有不同的政策,比如万网需要备案,但其万网背后所使用的接口均为apnic提供的!

并且可以通过域名供应商来设置DNS服务器的解析方式,有的时候一个域名可以拥有多个服务器,学网站制作的应该有了解,毕竟一个服务器是不能承载上千万的同时访问量的,其次考虑到线路方面的传递效率问题,很多大型网站会在不同地方设立不同的服务器,然后在域名供应商里把域名与多个服务器的独立IP绑定在一起,在设置一下解析模式即可!

获取指定域名的IP地址_第2张图片

只需要在DNS域名解析里把同一个域名解析到不同的服务器IP上即可!

这样在访问时DNS服务器会根据你当前的线路给你选择距离你最近的线路,这样线路传递数据的效率也有所提升,速度上也增加,解析只能通过地区不会精准到住所!

浏览器在域名解析时会把当前调用接口来进行请求其底层是TCP/IP协议,这样的话你的IP还会被传递过去,DNS服务器就可以通过你的IP来确定你的位置!

如何确定位置?

答:

根据IP号段,供应商在给你的互联网设备分配IP不是乱分配的,会根据你注册情况,提供的地址,来给你确定IP,比如123.26-155.26IP号段为上海市浦东新区,那么假如你的IP号段(IP地址前两个)在此范围内,那就可以确定地区了,随着人数的增多,有的时候会发现不在此范围内的号段也是某某地区的,是因为人数的增多,扩展出新的号段,不过这些我们是不需要关心的,因为这些是运营商自己后台会存储扩展好的!

 

Gethostbyname函数内部其实调用的是netconn_gethostbyname函数,netconn_gethostbyname函数是lwip(基于TCP/IP的开源小型协议栈,是瑞典计算机科学院(SICS)Adam Dunkels开发的)下的一个DNS域名查询接口开发的,并且此接口只要有TCP/IP库,即可调用,无需操作系统支持,并且TCP/IP库是纯C开发的,没有操作系统限制,适合嵌入式!


相关连接:网络通讯过程-互联网详解

你可能感兴趣的:(C/C++,Windows核心编程,Windows核心编程,c/c++)