之前都用数值地址来表示主机(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学习第九章 基本名字与地址转换的更多相关文章

  1. 《Unix 网络编程》11:名字和地址转换

    名字和地址转换 系列文章导航:<Unix 网络编程>笔记 域名系统 简介 域名系统主要用于主机名字和 IP 地址之间的映射.主机名可以是: 简单名字,如:centos01 全限定域名(FQ ...

  2. UNP学习笔记(第十一章 名字与地址转换)

    域名系统 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射. 主机名既可以是一个简单得名字,如solaris,也可以是一个全限定域名,如solaris.un ...

  3. UNP第11章——名字与地址转换

    1.域名系统 程序中只使用主机名和服务名的好处是,如果IP或端口变化,只需要改变映射关系,不需要重新编译程序. 1.1 资源记录 DNS的条目为资源记录,有用的项如下: A IPv4地址 AAAA I ...

  4. UNP总结 Chapter 11 名字与地址转换

    本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器名字和端口 ...

  5. UNIX网络编程读书笔记:名字与地址转换

    概述 在名字和数值地址间进行转换的函数: gethostbyname和gethostbyaddr:在主机名字与IPv4地址之间进行转换.仅仅支持IPv4. getservbyname和getservb ...

  6. C语言学习第九章

    学习C语言的最后一节课了,原因嘛上一章的末尾说过了,其实写这篇博客的时候以后开始学习Java一个多月了,一直因为各种各样的原因没有坚持做到每天一篇学习记录,可能主要因为懒吧....也有点笨,Java的 ...

  7. 【转载】Gradle学习 第九章:Groovy快速入门

    转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...

  8. Python爬虫学习==>第九章:正则表达式基础

    学习目的: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特点字符.及这些特点字符组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正式步骤 Step1 ...

  9. java并发学习--第九章 指令重排序

    一.happns-before happns-before是学习指令重排序前的一个必须了解的知识点,他的作用主要是就是用来判断代码的执行顺序. 1.定义 happens-before是用来指定两个操作 ...

随机推荐

  1. 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】

    题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...

  2. vue.js中created()与activated()的个人使用理解

    created():在创建vue对象时,当html渲染之前就触发:但是注意,全局vue.js不强制刷新或者重启时只创建一次,也就是说,created()只会触发一次:这时候只有dom没有数据挂载. a ...

  3. SSM + MySQL批量删除操作

    最近项目中有个购物车功能需要能够选中商品,然后批量删除的操作,也可以单个删除,其实代码很简单就能实现. 这里需要注意的就是你前端是怎么传值的,我这里采用的数组的形式,用 ‘,’隔开. 然后控制层代码如 ...

  4. 2016年Esri技术公开课全年资料分享

    大家好,2016年的公开课活动在上周全部结束,感谢大家的支持. 2016年的公开课共进行20期,共有24位讲师参与,公开课视频播放.课件下载次数累计超10万次,在这里衷心的感谢大家的积极参与和分享精神 ...

  5. bzoj 1233: [Usaco2009Open]干草堆tower 【想法题】

    首先这题的$n^3$的DP是比较好想的 $f[i][j]$表示用前$i$包干草 且最顶层为第$j+1$包到第$i$包 所能达到的最大高度 然而数据范围还是太大了 因此我们需要去想一想有没有什么单调性 ...

  6. webpack 4.+版本需要注意的地方

    在webpack打包的时候需要npm下载webpack-cli,而且打包JS的命令从以前的webpack .\src\main.js  .\dist\boundle.js 要编程 webpack .\ ...

  7. 104、Tensorflow 的变量重用

    import tensorflow as tf # 在不同的变量域中调用conv_relu,并且声明我们想创建新的变量 def my_image_filter(input_images): with ...

  8. jmeter添加自定义扩展函数之MD5加密

    1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...

  9. 【VisualStdio】在VS2015中显示上下文菜单中“创建单元测试”菜单

    ---恢复内容开始--- VS2012以后创建单元测试的选项被默认隐藏了,创建单元测试变得无比低效率.看msdn的说法好像是想推荐使用Intell Test来替代单元测试的用途,但是还没摸清楚也不敢瞎 ...

  10. 进程管理工具-Supervisord 使用

    简介 Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动.重启(自动重启程序).关闭进程(不仅仅是 Pytho ...