积水成渊:DNS查询器的linux C实例程序
作者:[db:作者]
时间:2021-07-29 09:41
DNS(
Domain Name System)域名系统提供了主机名和IP地址之间的转换。通常我们在应用程序中使用库函数
gethostbyname()和
gethostbyaddr()来完成两者之间的转换。但是为了更深入的学习网络底层知识,有必要从源代码级别来分析和实现
RFC 1034说明了DNS的概念和功能,
RFC 1035详细说明了DNS的规范和实现。通过阅读RFC,我们知道明白了,应用程序对DNS的访问是通过解析器来(
resolver)完成的,解析器并不像TCP/IP协议那样是OS的内核,而是通过网络访问DNS服务器来得到名字和地址的对应关系。OS的TCP/IP协议簇对DNS一点都知道。
工欲善其事必先利其器,先得进行些基础知识的复习:
《bit与byte的区别》和 《
bit与byte的联系》及《
位运算》,一个int是4个byte(十六进制中
01 02 03 04转化为十进制为
16909060),一个char是1个byte(十六进制中
97转化为字符为
a)。例如在十六进制中
0x80,用bit来表示就是
1000 0000,此时如果我们对它实施位(
>>5)运算,得到的结果就是
0000 0100,十六进制值为
0x04。
在Linux的内核代码中,经常可以看见形如
#define do{ }while(0)的宏定义,是否感到疑惑呢?宏定义只是帮助我们进行替换而已,当定义多条语句时,会在if...else...语句中产生歧义,详细解释参考
链接。(小插曲,我在测试中只
#include <stdlib.h>,忘记了
#include <stdio.h>,然后在后面使用了
printf等,结果编译的时候产生警告:
cs