C#编程实现DNS Client和Server(转)
我们大多数人使用DNS主要是用于域名解析,近期有个特殊的需求:通过DNS协议传递特殊数据。翻遍互联网,最终找到了一个强大的C# DNS工具库 ARSoft.Tools.Net library ,感谢CodePlex,感谢 AlexReinert !
关于DNS协议,请参考微软在线文档DNS的体系结构 或 RFC系列文档 。
我的要求很简单,把特定的DNS请求数据包发送到指定的服务器并获得返回结果。为了完成这个验证工作,你需要和我一样具备以下条件:
1.拥有一台具有外网地址的服务器,如:54.243.209.209;
2.设置防火墙策略,放行53/UDP端口的通讯;(非常重要,我测试的时候走了弯路-_-)
3.设置域名subA.mooo.com 的 A记录为 54.243.209.209
4.设置域名subB.mooo.com 的 NameServer为 subA.mooo.com
5.根据以上设置,但我们请求解析xxx.subB.mooo.com的域名时,54.243.209.209会收到来自DNS服务器的DNS请求数据包;
6.响应这个数据包就可以完成一次标准的DNS请求响应;
7.构造特殊的域名就可以实现特征数据的传递;
接下来,分别编写客户端和服务端代码。也可以参考官方文档中的样例:http://arsofttoolsnet.codeplex.com/ 配合WireShark抓包分析,能够很好地帮助您调试程序。
C#编程实现实现DNS请求客户端
新建一个C#项目,使用dotNet Framework 3.5作为运行环境。添加对库文件“ARSoft.Tools.Net.dll”的引用。编写如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ARSoft.Tools.Net.Dns; namespace MyDNSClient
{
/// <summary>
/// @auth shadu{AT}foxmail.com
/// @desc C# DNS Client
/// </summary>
class Program
{
static void Main(string[] args)
{
//ClientQuery("www.baidu.com");
ClientQuery("xxx.subB.mooo.com");
Console.ReadKey();
} public static void ClientQuery(string domain)
{
DnsMessage dnsMessage = DnsClient.Default.Resolve(domain, RecordType.A);
if ((dnsMessage == null) || ((dnsMessage.ReturnCode != ReturnCode.NoError) && (dnsMessage.ReturnCode != ReturnCode.NxDomain)))
{
Console.WriteLine("DNS request failed");
}
else
{
foreach (DnsRecordBase dnsRecord in dnsMessage.AnswerRecords)
{
ARecord aRecord = dnsRecord as ARecord;
if (aRecord != null)
{
Console.WriteLine("DNS request successfully : {0}",aRecord.Address.ToString());
}
}
}
}
}
}
C#编程实现实现DNS响应服务端
新建一个C#项目,使用dotNet Framework 3.5作为运行环境。添加对库文件“ARSoft.Tools.Net.dll”的引用。编写如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ARSoft.Tools.Net.Dns;
using System.Net; namespace DNSServer
{
/// <summary>
/// @auth shadu{AT}foxmail.com
/// @desc C# DNS Server
/// </summary>
class Program
{
static void Main(string[] args)
{
using (DnsServer server = new DnsServer(IPAddress.Any, , , ProcessQuery))
{
server.Start();
Console.WriteLine("Press any key to stop server");
Console.ReadLine();
}
} static DnsMessageBase ProcessQuery(DnsMessageBase message, IPAddress clientAddress, System.Net.Sockets.ProtocolType protocol)
{
message.IsQuery = false;
DnsMessage query = message as DnsMessage; // 官方的样例文档中没有体现DNS请求发起者的IP,我在这里增加了。
Console.WriteLine("Client Address:{0}", clientAddress.ToString());
Console.WriteLine("query.Questions.Count:{0}", query.Questions.Count);
Console.WriteLine("query.Questions.ToString():{0}", query.Questions.ToString());
Console.WriteLine("query.Questions[0].ToString():{0}", query.Questions[].ToString());
Console.WriteLine("query.Questions[0].GetType():{0}", query.Questions[].GetType().ToString());
Console.WriteLine("query.Questions[0].Name:{0}", query.Questions[].Name.ToString());
Console.WriteLine("query.Questions[0].RecordType:{0}", query.Questions[].RecordType.ToString());
Console.WriteLine("query.Questions[0].RecordClass {0}", query.Questions[].RecordClass.ToString()); if (query.Questions[].Name.Contains("subB.mooo.com"))
{ Console.WriteLine("Contains subB.mooo.com");
query.AnswerRecords.Add(new ARecord("xxx.subB.mooo.com", , IPAddress.Parse("9.9.9.9")));
message.ReturnCode = ReturnCode.NoError;
return message; }
else
{
Console.WriteLine("!!! not Contains mooo");
message.ReturnCode = ReturnCode.ServerFailure;
Console.WriteLine(message.ReturnCode.ToString()); return message;
}
}
}
}
服务端效果如图:

C#编程实现DNS Client和Server(转)的更多相关文章
- UDP编程中client和server中使用recvfrom和sendto的区别
client中: sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)&saddr,len); recvfrom(sfd,buf ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- Android简单的聊天室开发(client与server沟通)
请尊重他人的劳动成果.转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission ...
- SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数
原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...
- tmux protocol version mismatch (client 7, server 6)
$ tmux attach protocol version mismatch (client 7, server 6) $ pgrep tmux 3429 $ /proc/3429/exe atta ...
- New full duplex HTTP tunnel implementation (client and server)
https://issues.jboss.org/browse/NETTY-246?page=com.atlassian.jirafisheyeplugin:fisheye-issuepanel —— ...
- jvm的client和server
最近研究c++代码调用java的jar,发现64位的下的jvm在server路径,而32位的jvm则存在client路径下面,于是十分好奇,查了下,这里做个记录 JVM Server模式与client ...
- The client and server cannot communicate, because they do not possess a common algorithm
The client and server cannot communicate, because they do not possess a common algorithm This was re ...
- go http client, http server
Go语言中的HTTP client, server非常简单.具体如下. HTTP Server package main import ( "fmt" "html&quo ...
随机推荐
- Tkinter教程之Menu篇
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811321 '''Tkinter教程之Menu篇''''''1.创建一个简单的Menu'''# ...
- 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...
- ACM1994
/* Problem Description 为自行解决学费,chx勤工俭学收入10000元以1年定期存入银行,年利率为3.7% .利率按年计算,表示100元存1年的利息为3.7元.实际上有时提前有时 ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇07:全屏炸弹》
7.全屏炸弹 全屏炸弹概述: 为了增设游戏的趣味性,我们制作一个游戏的基本框架以外.还会增设一些其他的额外的功能.比如5秒无敌状态.冰冻效果等.下面咱们以消灭屏幕中所有炸弹为例,看除了碰撞可以触发事件 ...
- hive-mysql安装配置
默认情况下,hive的元数据信息存储在内置的Derby数据中.Facebook将hive元数据存储在关系数据库 1.安装好mysql ,sudo apt-get install mysql-serve ...
- HDU4861:Couple doubi(费马小定理)
题意: 给出k个球和质数p,对每个球以公式val(i)=1^i+2^i+...+(p-1)^i (mod p)计算出它的价值,然后两个人轮流拿,最后拿到的球的总价值大的获胜,问我们先手是否获胜. 我们 ...
- iOS开发中使用Bmob RESTful API
简介 尽管Bmob已经提供了一套SDK供开发者使用,但有时候开发者可能希望能直接与Bmob后台进行直接交互,以达到某些特别的需求(直接操作_User表.同步网络请求等).而RESTful API可以使 ...
- SRM 509 DIV1 500pt(DP)
题目简述 给定一个字符串,可以对其进行修改,删除,增加操作,相应的操作有对应的花费,要求你用最小的花费把字符串变为回文串 题目做法 先搞一遍floyed把各种操作的最小花费求出来,然后就是类似编辑距离 ...
- 【转】Maven实战(六)--- dependencies与dependencyManagement的区别
原博文出自于:http://blog.csdn.net/liutengteng130/article/details/46991829 感谢! 在上一个项目中遇到一些jar包冲突的问题,之后还有很 ...
- Spark生态之Spark MLbase/MLlib