TCP/IP网络编程——域名及网络地址

news2024/11/17 12:20:16

完整版文章请参考:
TCP/IP网络编程完整版文章

文章目录

    • 第 8 章 域名及网络地址
      • 8.1 域名系统
        • 8.1.1 什么是域名
        • 8.1.2 DNS 服务器
      • 8.2 IP地址和域名之间的转换
        • 8.2.1 程序中有必要使用域名吗?
        • 8.2.2 利用域名获取IP地址

第 8 章 域名及网络地址

8.1 域名系统

DNS 是对IP地址和域名进行相互转换的系统,其核心是 DNS 服务器(Domain Name System)

8.1.1 什么是域名

域名就是我们常常在地址栏里面输入的地址,将比较难记忆的IP地址变成人类容易理解的信息,比如这个IP (36.152.44.96) 是百度的地址,但是我们肯定记不住啊,所以将这个IP变成了 www.baidu.com 我们就都能记住了

8.1.2 DNS 服务器

相当于一个字典,可以查询出某一个域名对应的IP地址

如图所示,显示了 DNS 服务器的查询路径:

可以用以下两条指令查询地址

  • ping :如 ping www.baidu.com 后即可查看百度的IP
  • nslookup :输入该命令之后,进一步输入网址即可查询网站IP地址

8.2 IP地址和域名之间的转换

8.2.1 程序中有必要使用域名吗?

一句话,需要,因为IP地址可能经常改变,而且也不容易记忆,通过域名可以随时更改解析,达到更换IP的目的

8.2.2 利用域名获取IP地址

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

这个函数使用方便,只要传递字符串,就可以返回域名对应的IP地址。只是返回时,地址信息装入 hostent 结构体。此结构体的定义如下:

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.  */
};

从上述结构体可以看出,不止返回IP信息,同事还带着其他信息一起返回。域名转换成IP时只需要关注 h_addr_list。下面简要说明上述结构体的成员:

  • h_name:该变量中存有官方域名(Official domain name)。官方域名代表某一主页,但实际上,一些著名公司的域名并没有用官方域名注册。
  • h_aliases:可以通过多个域名访问同一主页。同一IP可以绑定多个域名,因此,除官方域名外还可以指定其他域名。这些信息可以通过 h_aliases 获得。
  • h_addrtype:gethostbyname 函数不仅支持 IPV4 还支持 IPV6 。因此可以通过此变量获取保存在 h_addr_list 的IP地址族信息。若是 IPV4 ,则此变量中存有 AF_INET。
  • h_length:保存IP地址长度。若是 IPV4 地址,因为是 4 个字节,则保存4;IPV6 时,因为是 16 个字节,故保存 16
  • h_addr_list:这个是最重要的的成员。通过此变量以整数形式保存域名相对应的IP地址。另外,用户比较多的网站有可能分配多个IP地址给同一个域名,利用多个服务器做负载均衡,。此时可以通过此变量获取IP地址信息。

调用 gethostbyname 函数后,返回的结构体变量如图所示:

下面的代码通过一个例子来演示 gethostbyname 的应用,并说明 hostent 结构体变量特性:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>

void error_handling(char* message);

int main(int argc, char* argv[])
{
    int i;
    struct hostent* host;

    if (argc != 2)
    {
        printf("Usage : %s <addr>\n", argv[0]);
        exit(1);
    }
   
    host = gethostbyname(argv[1]);
    if (!host)
        error_handling("gethost... error");

    printf("Official name: %s \n", host->h_name);
    for (i = 0; host->h_aliases[i]; i++)
        printf("Aliases %d: %s \n", i + 1, host->h_aliases[i]);

    printf("Official name: %s \n", (host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6");

    for (i = 0; host->h_aliases[i]; i++)
        printf("IP addr %d: %s \n", i + 1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));

    return 0;
}

void error_handling(char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重建大师可以实现识别地表树木吗?对数据格式有什么要求?

目前重建大师5.0具备自动单体化与切割单体化功能&#xff0c;在三维重建的过程中就可自动识别地表树木、建筑。 数据格式的话&#xff0c;目前是需要重建大师生产的倾斜模型数据&#xff0c;其他软件生产的模型暂不支持。重建大师目前并不是直接对模型数据进行深度学习识别&am…

Node.js包和模块的区别在哪儿

在Node.js 中&#xff0c;会将某个独立的功能封装起来&#xff0c;用于发布、更新、依赖管理和进行版本控制。Nodejs 根据CommonJS规范实现了包机制&#xff0c;开发了NPM包管理工具&#xff0c;用来解决包的发布和获取需求。 Node.js的包和模块并没有本质的不同&#xff0c;包…

详解linux中网络的几种模式:NAT,网桥,以及静态IP的配置和主机名

NAT模式 NAT就是网络地址转换&#xff0c;虚拟机和主机构建一个专有网络&#xff0c;通过NAT进行设备IP的转换&#xff0c;虚拟机通过共享主机的IP访问外界网络&#xff0c;但外部网络无法访问虚拟机。构建出的子网一般是WNET8. 网桥模式 也叫桥接模式&#xff0c;虚拟机直接…

Android发送广播时报错:Sending non-protected broadcast xxxxxxx from system xxxxxxxxxx

带android:sharedUserId“android.uid.system” 发送广播时&#xff0c;会出现 Sending non-protected broadcast 异常提醒&#xff1b; 原因&#xff1a; Ams在发送广播时&#xff0c;对于systemApp(系统应用)&#xff0c;会要求发送广播必须是声明在frameworks\base\core\re…

【实战项目】Django-Vue007---Redis、Python操作redis之普通连接和连接池、redis操作各种数据、django中使用redis

回顾 1、用户登录注册相关5个接口 多方式登录接口 手机号是否存在接口 发送验证码接口 验证码登录接口 验证码注册接口2、可以写验证码注册登录接口 如果手机号存在&#xff0c;直接登录成功 如果手机号不存在&#xff0c;直接创建用户&#xff0c;并且成功登录&#xff08;…

【计算机基础学科】操作系统学习笔记(考研王道参考书)

操作系统目录 文章目录操作系统目录一、操作系统概述1.1 操作系统基本概念1.1.1 操作系统的概念、功能1.1.2 操作系统的特性1.1.3 操作系统的发展与分类1.1.4 操作系统的运行机制1.2 内核态与用户态1.3 中断、异常1.4 系统调用~~1.5 计算机的层次结构~~~~1.6 操作系统引导&…

【数学建模】常用算法-主成分分析PCA的Python实现

1前言 本文主要讲解主成分分析析法&#xff08;PCA&#xff09;的python实现&#xff0c;后续会跟进实例分析 2 原理-代码实现 2.1 实现步骤 主成分分析PCA是一种应用广泛的和降维方法&#xff0c;对其实现做以下归纳 2.2 代码实现 导入包 import numpy as np定义计算协…

VBA提高篇_12 文本文件逐行读取,输入输出操作自如

文章目录一、VBA打开文本文件的4步操作二、文本输入Excel示例三、 Excel输出文本示例3.1 Open For Output3.2 Open For Append3.3 Print 打印文件3.4 工作簿 循环工作表 循环输出文件四 、先输入后输出 Demo实战演练一、VBA打开文本文件的4步操作 打开文本文件 找到指定文件并调…

看这篇就够了——ubuntu扩展屏幕及装显卡驱动后黑屏问题

1.问题说明首先说明为什么外接屏幕需要装显卡驱动&#xff0c;显卡由GPU和显存构成&#xff0c;又称为显示适配器&#xff0c;与数据的输出有密切关系。在ubuntu系统中&#xff0c;外接显示器是用的独立显卡驱动&#xff0c;而内置屏幕用的是集显驱动,也正是因为调用显卡的不同…

Day01-数据分析图鉴

文章目录Day01-数据分析图鉴一、 数据分析是什么&#xff1f;二、为什么数据分析这么火&#xff1f;三、数据分析的行业现状如何&#xff1f;四、对工作经验要求高吗&#xff1f;五、工资情况六、学完数据分析的效果&#xff1f;1、Python可视化2、TableauDay01-数据分析图鉴 …

Maven打包时出现Process terminated错误

Maven打包时出现Process terminated错误检查maven的配置文件多引入了一次控制器编码错误切点表达式错误用maven打包时出现Process terminated样式的错误&#xff0c;报错如下&#xff1a;查看报错信息 检查maven的配置文件 多引入了一次控制器 注释掉多余的 编码错误 File e…

软件设计质量(一)容错设计

出现非预期错误的原因解决方案原理介绍断根原理原理&#xff1a;将可能造成人错误的原因/条件从根本上排除断绝掉。通过冗余设计&#xff0c;屏蔽掉其中9种错误的方式&#xff1b;案例&#xff1a;USB的SD卡防写开关。4种可能性断根设计为只有1种可能是正确的。软件设计&#x…

【JavaEE初阶】第十节.多线程 (基础篇 ) 线程池(案例四)

文章目录 前言 一、线程池概述 二、线程池的使用方式 2.1 Java标准库中 线程池的使用 2.2 自己动手来模拟实现一个线程池 总结 前言 本篇文章将介绍多线程案例 —— 线程池&#xff0c;这也是一个非常有用的案例 在之前已经介绍过&#xff0c;进程本身已经能做到并发编…

HTTP错误响应码

4XX客户端错误 400 bad request 服务端认为客户端出现了错误&#xff0c;但是不能准确判断是哪种错误401 用户认证信息缺失或者不准确403 服务器理解请求&#xff0c;但是没有权限处理404 not found 服务器没有找到资源405 method not allowed 服务器不支持请求中的method方法…

VSCode加上dotnet7.0来创建开发,vs和vscode创建方法,命令创建和扩展方法创建区别,以及扩展推荐

吐槽一波&#xff1a; .net7出来第二天开始学习&#xff0c;前端vue3ts写法也得学 总监让熟悉一个星期新版本语言就动手开发&#xff0c;还要写前端&#xff0c;再带一个应届生开发&#xff0c;前端跑了我还得顶上&#xff0c; 天天催&#xff0c;天天问我进度怎么样&#xff0…

使用nginx给Nacos集群配置负载均衡

使用nginx的upstream模块进行负载第一、不想要加访问路径配置首先配置的时候需要把nacos配置的访问路径删除vim application.properties重新启动nacos 三个节点都配置一样的vim /etc/nginx/conf.d/default.conf 然后编写nginx的配置文件Nginx服务器ip 192.168.11.154upstream n…

SimCLS: A Simple Framework forContrastive Learning of Abstractive Summarization

论文 代码 摘要 本文提出了一个概念上简单但是强大的抽象摘要框架&#xff0c;SimCLS。它通过对比学习的方式&#xff0c;缓解了Seq2Seq框架固有的目标函数和评价指标不一致的问题&#xff0c;从而可以从模型生成的候选摘要中筛选出真实的评价指标(ROUGE)打分更高的摘要。将…

2023 中科院《国际期刊预警名单》发布,28 本学术期刊有风险,2区期刊14本,有哪些信息值得关注?

2023年1月31日&#xff0c;中国科学院文献情报中心终于发布了2023年《国际期刊预警名单&#xff08;试行&#xff09;》&#xff01; 名单分析&#xff1a; 与往年相比&#xff0c;今年的预警期刊名单变动还是相当大的 1. 生物学和数学期刊全部“洗白”&#xff0c;医学期刊…

Docker 安装可视化管理工具Portainer

简介Portainer是Docker 的图形化管理工具&#xff0c;提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作&#xff08;包括上传下载镜像&#xff0c;创建容器等操作&#xff09;、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理…

测试工程师笔试题整理01

来源&#xff1a; https://vt.quark.cn/blm/quark-doc-ssr-293/preview?idC2946438A278541B6C1284E5C22269AB 难度&#xff1a;⭐&#xff08;简单&#xff09; 一、基础题 1、对于软件测试描述正确的是 (目的是尽可能多的发现程序的错误)(2) 2、软件测试的对象包括(源程序…