当前位置: 首页 > news >正文

[C++ 网络协议编程] 域名及网络地址

1. DNS服务器

DNS(Domain Name System):是对IP地址和域名(如:www.baidu.com等)进行相互转换的系统,其核心是DNS服务器。

我们输入的www.baidu.com是域名,是一种虚拟地址,而非实际地址,DNS服务器会将这个虚拟地址转换为实际地址,即IP地址。若我们直接输入IP地址,则不会发生上面的转换。

如果想获取某个域名对应的IP地址,则可以cmd输入:ping www.baidu.com

如果想获取本机注册的默认的DNS服务器地址,则可以cmd输入:nslookup(windows)、nslookup server(linux)

所有计算机都记录着默认DNS服务器地址,通过这个DNS服务器就能得到相应域名的IP地址信息,如果本机的默认DNS服务器解析不了这个域名,那么就会逐级往上询问,直到根DNS服务器,它直到应该向哪个DNS服务器询问,再向下级DNS专递解析请求,得到IP地址后,返回给发起请求的主机。所以,DNS就是一种层次化管理的分布式数据库系统

2. IP地址和域名之间的转换

IP地址和域名之间的关系:一个IP地址可以对应多个域名,一个域名也可以对应多个IP地址。

通常来说,域名是不会变化的,但是IP地址是可以随时变化的,因为服务器会变化,尤其是像那种有多个服务器进行负载均衡的,就有多个IP地址,所以,我们在编写程序时,要通过用户输入的域名来解析获取IP地址。

2.1 gethostbyname函数(利用域名获取IP地址)

#include <netdb.h>
struct hostnet* gethostbyname(const char* hostname);
成功返回hostnet结构体,失败返回Null指针
struct hostent
{char* h_name;char** h_aliases;int h_addrtype;int h_length;char** h_addr_list;
}
参数含义
h_name存有官方域名。官方域名代表某一主页,不是所有公司都有
h_aliases其它可以访问这个域名所指向主页的域名。同一个IP可以绑定多个域名。
h_addrtype地址族信息,若是IPv4则是AF_INET,IPv6则是AF_INET6
h_length保存IP地址字节长度。IPV4则是4,IPV6则是16
h_addr_list

以整数形式保存域名对应的IP地址,每个数组实际上是以in_addr结构体存储的。

struct in_addr
{in_addr_t      s_addr;        //32位IPv4地址
}

所以在使用时,要进行强制转换为in_addr* 类型

hostent参数结构:

h_addr_list数组实际上是以in_addr结构体存储的,为什么不直接以in_addr数组存储,而是以字符数组存储?

答:是因为为了兼容IPv6地址信息,考虑到通用性,所以用字符数组存储。

那为什么不用void*存储?

答:是因为当时还没有对void指针标准化,当时无法明确指出指针类型时采用的就是char指针。 

2.2 gethostbyaddr函数(利用IP地址获取域名)

#include<netdb.h>
struct hostent* gethostbyaddr(
const char* addr,          //含有IP地址信息的in_addr结构体指针,同时为了传递IPv4地址之外的其他信息,所以声明为char指针
socklen_t len,             //向第一个参数传递的地址信息字节数,IPv4为4,IPv6为16
int family                 //地址族信息
);
http://www.lryc.cn/news/135151.html

相关文章:

  • Java【HTTP】什么是 Cookie 和 Session? 如何理解这两种机制的区别和作用?
  • 使用U盘重装Windows10系统详细步骤及配图【官方纯净版】
  • 数据结构之——(手撕)顺序表
  • 冠达管理:非银金融是什么?
  • go 结构体
  • C++学习笔记---- 引用
  • 2023国赛数学建模思路 - 案例:感知机原理剖析及实现
  • Cesium加载Supermap的wmts服务
  • C/C++:C/C++在大数据时代的应用,以及C/C++程序员未来的发展路线
  • linux RabbitMQ-3.8.5 安装
  • 单链表Single-LinkList
  • AI嵌入式全景:各厂商、系列和开发工具的综合概览
  • mysql Left Join on条件 where条件的用法区别
  • Redis中的淘汰策略
  • MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射,让你在面试中脱颖而出!!
  • C++ 写入txt文件内容并追加内容
  • Leetcode---359周赛
  • Keras三种主流模型构建方式:序列模型、函数模型、子类模型开发实践,以真实烟雾识别场景数据为例
  • objective-v 获取iPhone系统当前时间字符串适配12小时制和24小时制
  • 并查集及其简单应用
  • 基于web的服装商城系统java网上购物商店jsp源代码mysql
  • .NET Core发布到IIS
  • Spring的基本概念
  • 设计模式之原型模式
  • 正则表达式在网页处理中的应用四则
  • ping使用方法
  • “心理健康人工智能产学研创新联盟”揭牌成立|深兰科技
  • FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「端口映射」
  • Mybatis-动态sql和分页
  • 基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)