本来是一次计算机网络的实验,但是还没有完全写好,DNS的响应请求报文的冗余信息太多了,不只有IP地址。所以这次的实验主要就是解析DNS报文。同时也需要正确的填充请求报文。如果代码有什么bug,欢迎指正啊。代码排版有点乱。。。
本文有以下内容
DNS报文的填充和解析
利用socket API传输信息
一、填充DNS请求报文
随便百度一下,就可以知道DNS报文的格式。所以这里只介绍如何填充DNS报文。
首先是填充报文首部:
然后填充报文的问题部分:
域名格式:该部分一数字开始以0结束。
查询类型:1代表IP地址、2代表名字服务器、5代表规范名称、12代表指针记录
查询类:1代表互联网
下面是填充域名为百度(www.baidu.com)的代码
二、利用socket发送DNS报文
下面是代码:
这部分就是普通的socket的创建、发送和接收过程。
三、解析DNS响应报文
自己错将16进制的数错看为10进制数了,在这里坑了很长时间。注意报文中的指针的偏移量,只有指针的偏移量指的是规范名称该资源记录才是IP地址。在报文中还有很多和IP地址无关的资源记录。下面是代码,不过遇到复杂的DNS报文可能有bug。这里只实验了三个域名:www.ccnu.edu.cn
www.baidu.com www.163.com(这个域名有点复杂)。
四、完整的代码和总结
下面是完整的代码:
总结:刚开始感觉无从下手
不知道如何与DNS服务器交换信息 就用socket向服务器发送报文
不知道如何发送请求报文 百度喽
不知道如何处理响应报文 自己查看报文格式
暂时就这么多吧!
感谢下面的博客:
原文:http://www.cnblogs.com/mr-zys/p/3784629.html