【TCP/IP】IP地址与域名之间的转换 您所在的位置:网站首页 域名转ip地址 【TCP/IP】IP地址与域名之间的转换

【TCP/IP】IP地址与域名之间的转换

#【TCP/IP】IP地址与域名之间的转换| 来源: 网络整理| 查看: 265

目录

域名系统

DNS服务器

IP地址和域名之间的转换

通过域名获取IP地址

通过IP地址获取域名

域名系统

        域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

DNS服务器

        所有计算机中会保存记录默认DNS服务器的地址,通过默认DNS服务器便可得到相应域名的IP地址信息。在浏览器地址栏中输入域名后,浏览器会通过默认DNS服务器来获取该域名对应的IP地址信息,从而建立起与目标服务器之间的连接。

补充:

        在Linux系统中,有两条指令可以帮助我们查看DNS服务器地址及其对应的IP地址。

ping:能够查看某一域名对应的IP地址nslookup:用于查询DNS的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题

        计算机内置的默认DNS服务器并不知道网络上所有域名的IP地址。当默认DNS服务器无法解析时,则会询问其他DNS服务器,进行多次迭代直到查找到为止,最终把查询记录交还给用户。

        如上图,描述了在默认DNS服务器无法查找到目标域名IP地址时的更迭过程。不难看出,DNS是一种层次化管理的分布式数据库系统。

IP地址和域名之间的转换

        在之前,我们编写的程序都是以IP+端口号的形式来构建连接,然而这只限于IP地址较为固定的场景。当我们需要访问互联网中各类网页时,依靠输入IP地址和端口号这种方式将会显得十分笨拙。(试想如果IP地址发生变化,程序是否就得重新编写)那么,什么方法可以解决这个问题呢?

        域名相对于IP地址,变化更少且稳定,那么利用域名来编写程序便可使维护变得更加轻松。在网络编程中,也有一个合适的函数,能够帮助我们通过域名地址来解析出所需要的各类信息。

通过域名获取IP地址

        使用以下函数可以通过传递域名的字符串形式来获取IP地址。

#include struct hostent * gethostbyname(const char * hostname); //成功时返回hostent结构体地址,失败时返回NULL指针

        通过gethostbyname函数,我们只需要传递域名的字符串,就可以得到域名对应的IP地址。但需要注意的是,返回的数据类型是一个结构体形式。该结构体定义如下:

/* Description of data base entry for a single host. */ struct hostent { char *h_name; /* Official name of host. */ char **h_aliases; /* Alias list. */ int h_addrtype; /* Host address type. */ int h_length; /* Length of address. */ char **h_addr_list; /* List of addresses from name server. */ #ifdef __USE_MISC # define h_addr h_addr_list[0] /* Address, for backward compatibility.*/ #endif };

        除了IP地址外,该结构体还带有其他信息。以下是对该结构体中各变量意义的描述:

h_name 用以保存官方域名

h_alìases 用以保存多个可能存在的域名

h_addrtype 用以保存在h_addr_list中IP地址对应的地址族信息。若是IPv4,则变量为AF_INET。h_length 用以保存IP地址的长度 。若是IPv4地址(4个字节存储) ,则该值为4;IPv6时(16个字节存储),则值为16。

h_addr_list 用以保存多个可能存在的IP地址,变量以char *形式保存域名对应的IP地址 。

        结构体的抽象结构如下:

        让我们尝试一下利用gethostbyname(在netdb.h头文件中)函数来编写一个域名转IP的小程序。

demo_byname.cpp

#include #include #include int main() { struct hostent *host; std::string domainAddress; std::cout domainAddress; host = gethostbyname(domainAddress.c_str()); if (!host) { std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有