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

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

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

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

 

第一部分请参考:如何用W7100A实现DNS客户端(一)/  http://blog.csdn.net/wiznet2012/article/details/7990852

 

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

 

 

本篇文档介绍完毕了,欢迎大家讨论并咨询!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Java实现WebSocket客户端可以通过Java提供的WebSocket API来完成。下面是一个简单的WebSocket客户端的示例代码: ```java import java.net.URI; import java.net.URISyntaxException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; public class WebSocketClientExample { public static void main(String[] args) throws URISyntaxException, InterruptedException { final CountDownLatch latch = new CountDownLatch(1); WebSocketClient client = new WebSocketClient(new URI("ws://echo.websocket.org/")) { @Override public void onOpen(ServerHandshake handshakedata) { System.out.println("Opened connection"); } @Override public void onMessage(String message) { System.out.println("Received message: " + message); latch.countDown(); } @Override public void onClose(int code, String reason, boolean remote) { System.out.println("Closed connection"); } @Override public void onError(Exception ex) { System.out.println("Error occurred: " + ex.getMessage()); } }; client.connect(); client.send("Hello, server!"); latch.await(10, TimeUnit.SECONDS); client.close(); } } ``` 这个例子使用了Java-WebSocket库来实现WebSocket客户端。在代码中,首先创建了一个CountDownLatch对象来控制程序的执行流程。然后创建一个WebSocketClient对象,并覆盖了其onOpen、onMessage、onClose和onError方法以处理WebSocket连接的各种事件。在主函数中,首先连接WebSocket服务器,然后向服务器发送一条消息,最后等待服务器返回消息。如果服务器返回消息,则CountDownLatch对象减一,程序退出。 要使用Java-WebSocket库,需要在Maven或Gradle等构建工具中添加以下依赖: ```xml <dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>1.4.1</version> </dependency> ``` 这样就可以使用Java实现WebSocket客户端了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值