C#編程實現DNS Client和Server(轉)

來源:互聯網
上載者:User

標籤:des   style   blog   http   io   ar   color   os   使用   

我們大多數人使用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, 10, 10, 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[0].ToString());            Console.WriteLine("query.Questions[0].GetType():{0}", query.Questions[0].GetType().ToString());             Console.WriteLine("query.Questions[0].Name:{0}", query.Questions[0].Name.ToString());            Console.WriteLine("query.Questions[0].RecordType:{0}", query.Questions[0].RecordType.ToString());            Console.WriteLine("query.Questions[0].RecordClass {0}", query.Questions[0].RecordClass.ToString());             if (query.Questions[0].Name.Contains("subB.mooo.com"))            {                 Console.WriteLine("Contains subB.mooo.com");                query.AnswerRecords.Add(new ARecord("xxx.subB.mooo.com", 3600, 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(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.