上面的代码封装了一个新的DefaultDnsResponse对象,并使用query的id作为DefaultDnsResponse的id 。并将question作为response的QUESEION section 。
除了QUESTION section,response中还需要ANSWER section,这个ANSWER section需要填充一个DnsRecord 。
这里构造了一个DefaultDnsRawRecord,传入了record的name,type,ttl和具体内容 。
最后将构建好的DefaultDnsResponse返回 。
因为客户端查询的是A address,按道理我们需要通过QUESTION中传入的domain名字,然后根据DNS服务器中存储的记录进行查找,最终返回对应域名的IP地址 。
但是因为我们只是模拟的DNS服务器,所以并没有真实的域名IP记录,所以这里我们伪造了一个ip地址:
private static final byte[] QUERY_RESULT = new byte[]{46, 53, 107, 110};然后调用Unpooled的wrappedBuffer方法,将byte数组转换成为ByteBuf,传入DefaultDnsRawRecord的构造函数中 。
这样我们的DNS服务器就搭建好了 。
DNS客户端消息请求上面我们搭建好了DNS服务器,接下来就可以使用DNS客户端来请求DNS服务器了 。
这里我们使用之前创建好的netty DNS客户端,只不过进行少许改动,将DNS服务器的域名和IP地址替换成下面的值:
Do53TcpClient client = new Do53TcpClient(); final String dnsServer = "127.0.0.1"; final int dnsPort = 53; final String queryDomain ="www.flydean.com"; client.startDnsClient(dnsServer,dnsPort,queryDomain);dnsServer就填本机的IP地址,dnsPort就是我们刚刚创建的默认端口53 。
首先运行DNS服务器:
INFO i.n.handler.logging.LoggingHandler - [id: 0x021762f2] REGISTEREDINFO i.n.handler.logging.LoggingHandler - [id: 0x021762f2] BIND: 0.0.0.0/0.0.0.0:53INFO i.n.handler.logging.LoggingHandler - [id: 0x021762f2, L:/0:0:0:0:0:0:0:0:53] ACTIVE可以看到DNS服务器已经准备好了,绑定的端口是53 。
然后运行上面的客户端,在客户端可以得到下面的结果:
INFO c.f.d.Do53TcpChannelInboundHandler - question is :DefaultDnsQuestion(www.flydean.com. IN A)INFO c.f.d.Do53TcpChannelInboundHandler - ip address is: 46.53.107.110可以看到DNS查询成功,并且返回了我们在服务器中预设的值 。
然后再看一下服务器端的输出:
INFO i.n.handler.logging.LoggingHandler - [id: 0x021762f2, L:/0:0:0:0:0:0:0:0:53] READ: [id: 0x44d4c761, L:/127.0.0.1:53 - R:/127.0.0.1:65471]INFO i.n.handler.logging.LoggingHandler - [id: 0x021762f2, L:/0:0:0:0:0:0:0:0:53] READ COMPLETEINFO c.f.d.Do53ServerInboundHandler - Query is: DefaultDnsQuestion(www.flydean.com. IN A)可以看到服务器端成功和客户端建立了连接,并成功接收到了客户端的查询请求 。
总结以上就是使用netty默认DNS服务器端的实现原理和例子 。因为篇幅有限,这里只是默认了type为A address的情况,对其他type感兴趣的朋友可以自行探索 。
本文的代码,大家可以参考:
learn-netty4
【手把手教你使用netty搭建一个DNS tcp服务器】
经验总结扩展阅读
- MySQL该使用哪种CPU架构服务器?
- Pwn学习随笔
- 微信用过的小程序怎么找回 使用过小程序怎么找回
- mac小辣椒适合黄皮的人使用吗?
- 教你如何练出胸肌 如何练出胸肌
- vivo怎么看每天手机使用时间 vivo手机怎么看一天用手机时长
- 冰箱1-7档哪个最冷 使用冰箱档位的注意事项有哪些
- 空调除湿模式耗电量大吗 空调除湿模式的使用方法有哪些
- 保温材料有哪些 使用保温材料的注意事项有哪些
- 榆木家具刷漆好还是木蜡油 木蜡油使用要注意什么
