2012年9月19日星期三

【Final】如何用W7100A單晶片,實現DNS用戶端(二)


這篇文檔將會介紹DNS以及如何用iMCU7100EVB來實現DNS用戶端,並且通過實際例子演示該功能。

在昨天的博文“如何用W7100A單晶片,實現DNS用戶端(一)”我們給大家介紹了第二章網域名稱系統以及第三章DNS演示的部分,今天繼續與大家分享第四章實現代碼的內容。本文中所有的示例代碼全部基於Keil編譯環境。

這是本篇文檔的最後一部分,希望對大家有所幫助。




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段的长度。




技術支援: wiznetbj@wiznettechnology.com
銷售和代理: winzethk@wiznettechnology.com

更多資訊,請登錄我們的官方網站:http://www.iwiznet.cn


有關產品W7100A的更多應用博文,請參考下列文章:
如何用W7100A實現DNS用戶端
如何用W7100A實現HTTP用戶端(一)

没有评论:

发表评论