UNP学习第九章 基本名字与地址转换
之前都用数值地址来表示主机(206.6.226.33),用数值端口号来标识服务器。
然而,我们应该使用名字而不是数值:名字比较容易记,数值地址可以改变但名字保持不变。
随着往IPv6上转移,数值地址变得更长,手工输入地址更易出错。
一、域名系统
域名系统DNS(Domain Name System)主要用于主机名与IP地址间的映射。
主机名可以是简单的名字,如solaris或bsdi,也可以是全限定域名FQDN,如solaris.kohala.com
严格来说,FQDN也称为绝对名字,因此必须以一个点号结尾,但用户经常省略最后的点号。
资源记录
DNS中的条目称为资源记录RR(resource record)。
A A记录将主机名映射为32位IPv4地址。
AAAA AAAA记录将主机名映射为128位的IPv6地址。
PTR PTR记录将IP地址映射为主机名。对于IPv4地址,32位地址的四个字节顺序反转,每个字节都转换成十进制ASCII值(0~255),然后附上in-addr.arpa,结果串用于PTR查询。
对于IPv6地址,128位地址中的32个4位组顺序反转,每组被转换成相应的十六禁止ASCII值,并附上ip6.int
例如:33.226.62.206.in-addr.arpa和3.e.3.e.8.7.0.2.0.0.8.0.0.2.0.0.0.0.2.e.e.3.e.c.0.0.f.d.b.l.f.5.ip6.int
MX MX记录指定一主机作为某主机的“右键交换器”。
CNAME CNAME代表canonical name规范名字,其常见的用法是为常用服务如ftp和www指派一个CNAME记录。
解析器代码读其依赖于系统的配置文件来确定组织的名字服务器们的所在位置(我们用复数“名字服务器们”是因为大多数组织运行多个名字服务器,虽然我们在图中只画了一个本地服务器)。
文件/etc/resolv.conf一般包含本地名字服务器的IP地址。
解析器用UDP给本地名字服务器发查询,如果本地 名字服务器不知道答案,它也用UDP在整个英特网上给其他名字服务器发查询。
二、gethostbyname函数
- #include <netdb.h>
- struct hostent *gethostbyname(const char *hostname);
- 返回:成功非空指针,出错空指针,同时设置h_errno
- struct hostent {
- char *h_name; /* official(canonical) name of host */
- char **h_aliases; /* pointer to array of pointers to alias names */
- int h_addrtype; /* host address type: AF_INET or AF_INET6 */
- int h_length; /* length of address: 4 or 16 */
- char **h_addr_list; /* ptr to array of ptrs with IPv4 or IPv6 addrs */
- };
- #define h_addr h_addr_list[0] /* first address in list */
gethostbyname执行一个对A记录的查询或对AAAA记录的查询。
三、gethostnyname2函数与IPv6支持
- #include <netdb.h>
- struct hostent *gethostbyname2(const char *hostname, int family);
- 返回:成功非空指针,出错空指针,同时设置h_errno
family:AF_INET还是AF_INET6
四、gethostbyaddr函数
- #include <netdb.h>
- struct hostent *gethostbyaddr(const char *addr, size_t len, int family);
- 返回:成功非空指针,出错空指针,同时设置h_errno
五、uname函数
- #include <sys/utsname.h>
- int uname(struct utsname *name);
- 返回:成功非负值,出错-
#define UTS_NAMESIZE 16
#define UTS_NODESIZE 256- struct utsname {
- char sysname[_UTS_NAMESIZE]; /* name of this operating system */
- char nodename[_UTS_NODESIZE]; /* name of this node */
- char release[_UTS_NAMESIZE]; /* O.S release level */
- char version[_UTS_NAMESIZE]; /* O.S version level */
- char machine[_UTS_NAMESIZE]; /* hardware type */
- };
六、gethostname函数
- #include <unistd.h>
- int gethostname(char *name, size_t namelen);
- 返回:0成功,-1出错
七、getservbyname和getservbyport函数
- #include <netdb.h>
- struct servent *getservbyname(const char *servname, const char *protoname);
- 返回:成功非空指针,出错空指针
- struct servent {
- char *s_name; /* official service name */
- char **s_allases; /* alias list */
- int s_port; /* port number, network-byte order */
- char *s_proto; /* protocol to use */
- };
给定端口号和可选协议后查找相应的服务
- #include <netdb.h>
- struct servent *getservbyport(int port, const char *protname);
- 返回:成功非空指针,出错空指针
UNP学习第九章 基本名字与地址转换的更多相关文章
- 《Unix 网络编程》11:名字和地址转换
名字和地址转换 系列文章导航:<Unix 网络编程>笔记 域名系统 简介 域名系统主要用于主机名字和 IP 地址之间的映射.主机名可以是: 简单名字,如:centos01 全限定域名(FQ ...
- UNP学习笔记(第十一章 名字与地址转换)
域名系统 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射. 主机名既可以是一个简单得名字,如solaris,也可以是一个全限定域名,如solaris.un ...
- UNP第11章——名字与地址转换
1.域名系统 程序中只使用主机名和服务名的好处是,如果IP或端口变化,只需要改变映射关系,不需要重新编译程序. 1.1 资源记录 DNS的条目为资源记录,有用的项如下: A IPv4地址 AAAA I ...
- UNP总结 Chapter 11 名字与地址转换
本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器名字和端口 ...
- UNIX网络编程读书笔记:名字与地址转换
概述 在名字和数值地址间进行转换的函数: gethostbyname和gethostbyaddr:在主机名字与IPv4地址之间进行转换.仅仅支持IPv4. getservbyname和getservb ...
- C语言学习第九章
学习C语言的最后一节课了,原因嘛上一章的末尾说过了,其实写这篇博客的时候以后开始学习Java一个多月了,一直因为各种各样的原因没有坚持做到每天一篇学习记录,可能主要因为懒吧....也有点笨,Java的 ...
- 【转载】Gradle学习 第九章:Groovy快速入门
转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...
- Python爬虫学习==>第九章:正则表达式基础
学习目的: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特点字符.及这些特点字符组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正式步骤 Step1 ...
- java并发学习--第九章 指令重排序
一.happns-before happns-before是学习指令重排序前的一个必须了解的知识点,他的作用主要是就是用来判断代码的执行顺序. 1.定义 happens-before是用来指定两个操作 ...
随机推荐
- VM安装OSX进度条一半时卡住不动,【附】OSX10.10 ISO镜像文件
安装OSX10.10真是一波多折,先是下载了一个5G多的原版dmg文件,转成ISO后在虚拟机上无法识别,后按网上的说的方法在提取出来的BaseSystem.dmg文件,再转成ISO文件,可以 ...
- JS中常见的几种报错类型
1.SyntaxError(语法错误) 解析代码时发生的语法错误 var 1a; //Uncaught SyntaxError: Invalid or unexpected token 变量名错误 c ...
- 圆周率Pi是如何计算出来的
object SparkPi { def main(args: Array[String]) { val spark = SparkSession .builder .appName("Sp ...
- 原生 js 实现 vue 的某些功能
1.数据双向绑定:https://www.cnblogs.com/yuqing-o605/p/6790709.html?utm_source=itdadao&utm_medium=referr ...
- 初步认识pug
一.初步认识pug 1.所谓的pug就是我们之前说的jade,也就是一种通过缩进的方式来编写代码的过程,在编译的过程中,我们不需要考虑标签是否闭合的问题.此外,用这种编译方式,加快了我们写代码的速度, ...
- SQL学习记录:函数(二)
字符串函数 1.获取字符的ASCII码 语法结构: ASCII(espression) 这里的expression是一个返回char或varchar数据类型的表达式,ASCII函数仅对表达式最左 ...
- bash 中的特殊变量
bash 中的特殊变量 变量 说明 ------------------------------------ $0 当前脚本的文件名 $n 第n个位置参数 $* 传递给脚本或函数的所有参数,$*会将这 ...
- 如何访问 Redis 中的海量数据,服务才不会挂掉?
来源:www.toutiao.com/i6697540366528152077 一.前言 有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况 ...
- 调用js方法返回值为undefined
问题描述: 我写的js方法: function getname(code){ var name $.post("",{ code:code },function(resurlt){ ...
- redis-3.0.0安装
redis-3.0.0安装 前言 redis是常用的no-sql数据库,常用于缓存数据,同时,他也可以持久化数据.他是C语言开发的,所以安装的时候需要编译. 单机版redis yum install ...