在socket中运用域名

2023-05-12,,

客户端中直接运用IP地址会有很大的弊病,一旦IP地址变更(IP地址会常常变化),客户端软件就会呈现毛病。
而运用域名会便利许多,注册后的域名只需每年续费就永远属于本人的,改换IP地址时修正域名解析即可,不会影响软件的正常运用。
关于域名注册、域名解析、host 文件、DNS 效劳器等本节并未具体解说,请读者自行脑补。本节重点解说若何运用域名。

经过域名获取IP地址

域名仅仅是IP地址的一个助记符,目标是便利记忆,经过域名并不克不及找到目的盘算机,通讯之前必需要将域名转换成IP地址。
gethostbyname() 函数可以完成这种转换,它的原型为:

			struct hostent *gethostbyname(const char *hostname);

hostname 为主机名,也就是域名。运用该函数时,只需传递域名字符串,就会前往域名对应的IP地址。前往的地址信息会装入 hostent 构造体,该构造体的界说如下:

			struct hostent{ char *h_name; //official name char **h_aliases; //alias list int h_addrtype; //host address type int h_length; //address lenght char **h_addr_list; //address list }

从该构造体可以看出,不只前往IP地址,还会附带其他信息,列位读者只需存眷最初一个成员 h_addr_list。下面是对各成员的阐明:

  • h_name:官方域名(Official domain name)。官方域名代表某一主页,但实践上一些有名公司的域名并未用官方域名注册。

  • h_aliases:别号,可以经过多个域名拜访统一主机。统一IP地址可以绑定多个域名,因而除了以后域名还可以指定其他域名。

  • h_addrtype:gethostbyname() 不只支撑 IPv4,还支撑 IPv6,可以经过此成员获取IP地址的地址族(地址类型)信息,IPv4 对应 AF_INET,IPv6 对应 AF_INET6。

  • h_length:保管IP地址长度。IPv4 的长度为4个字节,IPv6 的长度为16个字节。

  • h_addr_list:这是最主要的成员。经过该成员以整数方式保管域名对应的IP地址。关于用户较多的效劳器,能够会分派多个IP地址给统一域名,应用多个效劳器停止平衡负载。

hostent 构造体变量的构成如下图所示:

下面的代码次要演示 gethostbyname() 的使用,并阐明 hostent 构造体的特征:

			#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") int main(){ WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData); struct hostent *host = gethostbyname("www.baidu.com"); if(!host){ puts("Get IP address error!"); system("pause"); exit(0); } //别号 for(int 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"); //IP地址 for(int 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] ) ); } system("pause"); return 0; }

运转后果:
Aliases 1: www.baidu.com
Address type: AF_INET
IP addr 1: 61.135.169.121
IP addr 2: 61.135.169.125

《在socket中运用域名.doc》

下载本文的Word格式文档,以方便收藏与打印。