如何用W7100A实现DNS客户端(二)【Final】

这篇文档将会介绍DNS以及如何用iMCU7100EVB来实现DNS客户端,并且通过实际例子演示该功能。

在昨天的博文“如何用W7100A实现DNS客户端(一)”我们给大家介绍了第二章域名系统以及第三章DNS演示的部分,今天继续与大家分享第四章实现代码的内容。本文中所有的示例代码全部基于Keil编译环境。

这是本篇文档的最后一部分,希望对大家有所帮助。

第一部分请参考:如何用W7100A实现DNS客户端(一)

4      实现代码

本章将会介绍相关的示例代码,这些代码被下载到iMCU7100EVB开发板后,开发板利用UDP协议实现DNS客户端的功能。更多关于UDP协议的详细信息,请参考文档‘如何使用W7100A实现UDP通信’。

4.1    dns_query()函数

该DNS客户端的示例代码是用dns_query()函数完成的。其它的低级函数被dns_query()函数调用执行。代码4.1为dns_query()函数的代码。

所有的变量都定义于dns_query()函数内,结构变量dhdr位于dns.c的头文件中。DNS_IP保存DNS服务器的IP地址,必须正确输入。

首先,打开UDP socket。在代码4.2中,将端口号设置为5000(端口号可以根据用户的需求进行修改),然后利用dns_makequery()函数(后面将会详细介绍该函数)创建一个查询信息。在查询信息创建后,调用sento()函数将该信息作为一个UDP数据包发送到服务器。

在发送完查询信息后,iMCU7100EVB等待DNS服务器的响应。通过getSn_RX_RSR()函数来确认DNS服务器是否接收到响应信息;如果在一段时间后没有收到响应,就会认为是超时。一旦有响应,通过recvfrom()函数接收响应,并且调用parseMSG()函数来解析该响应信息。parseMSG()函数可以检测来自DNS服务器应答的rcode(DNS信息报文头段);并且返回1或者0。若返回值为1(rcode=0), 表示域名搜索成功。除了0之外的其它值都表示发生错误,但是在示例代码中,对于其它错误parseMSG()函数的返回值都将为0。

4.2    dns_makequery()函数

dns_makequery()函数由dns_query()函数调用来创建DNS查询信息。更多的详细信息,请参考第2章DNS查询信息的配置。该函数的返回值为DNS缓存器的信息指针。

查询信息是由dns_makequery()函数创建的,具体格式在第2章已经介绍。在缓存器中输入DNS信息时要用到Put16()函数,该函数将16位的输入保存到8位的缓存器中。

4.3    parseMSG()函数

parseMSG()由dns_query()函数调用,用来分析接收到的DNS信息。首先分析报文头段,然后调用dns_question()函数来分析问题段,之后再次调用dns_answer()函数分析应答段。最后将已经分析完成的应答信息、与域名相对应的IP地址保存到一个变量中通过printf()函数进行输出。

4.4        dns_question()函数

dns_question()函数由parseMSG()函数调用,用来分析问题段(如:Qname、Qtype、

Qclass)。更多的详细信息,请参考RFC1034和RFC1035文档中问题段的值。

4.5          dns_answer()函数

dns_answer()函数由parseMSG()函数调用,用来对资源记录(RRs)段(Name、Type、

Class、TTL、Rdlength、Rddata)进行分析。在对所有的信息类型解析完成之后,如果信息的类型为TypeA、TypePTR、TypeHINFO、TypeMX、TypeSOA或者TypeTXT时,需要对其进行再次解析。

更多的详细信息,请参考RFC1034和RFC1035文档中对各信息类型的介绍。

4.6         parse_name()函数

parse_name()函数只分析来自DNS应答信息的name段。parse_name()函数也可以改变DNS信息格式从而使用户更容易进行操作,在分析完成之后返回Name段的长度。

有关产品W7100A的更多应用博文,请参考下列文章:

如何用W7100A实现DNS客户端

如何用W7100A实现HTTP客户端(一)