示例#1
0
文件: Program.cs 项目: zedoax/dig
        /// <summary>
        /// Build and Send Query, Return Response
        /// </summary>
        public string TransactQuery()
        {
            try
            {
                // Generate the Request
                var hostnameParts = _hostname.Split(".");
                var request       = new byte[41 + _hostname.Length + hostnameParts.Length];

                request[0] = 33;
                request[1] = 33;

                request[2]  = 1;
                request[3]  = 32;
                request[5]  = 1;
                request[11] = 1;

                var bitIdx = 12;
                for (int partIdx = 0; partIdx < hostnameParts.Length; partIdx++)
                {
                    request[bitIdx] = BitConverter.GetBytes(hostnameParts[partIdx].Length)[0];
                    bitIdx++;
                    foreach (var chr in hostnameParts[partIdx])
                    {
                        request[bitIdx] = BitConverter.GetBytes(chr)[0];
                        bitIdx++;
                    }
                }

                request[bitIdx] = 0;
                bitIdx++;
                request[bitIdx] = 0;
                bitIdx++;
                switch (_type)
                {
                case QueryType.a:
                    request[bitIdx] = 1;
                    break;

                case QueryType.aaaa:
                    request[bitIdx] = 28;
                    break;

                case QueryType.cname:
                    request[bitIdx] = 5;
                    break;
                }
                bitIdx++;
                request[bitIdx] = 0;
                bitIdx++;
                request[bitIdx] = 1;
                bitIdx         += 3;
                request[bitIdx] = 41;
                bitIdx++;
                request[bitIdx] = 16;
                bitIdx         += 7;
                request[bitIdx] = 12;
                bitIdx         += 2;
                request[bitIdx] = 10;
                bitIdx         += 2;
                request[bitIdx] = 8;
                bitIdx++;
                request[bitIdx] = 78;
                bitIdx++;
                request[bitIdx] = 31;
                bitIdx++;
                request[bitIdx] = 252;
                bitIdx++;
                request[bitIdx] = 130;
                bitIdx++;
                request[bitIdx] = 235;
                bitIdx++;
                request[bitIdx] = 126;
                bitIdx++;
                request[bitIdx] = 94;
                bitIdx++;
                request[bitIdx] = 41;


                // Initialize the client by binding the socket
                var client = new UdpClient(_dnsserver.AddressFamily.Equals(AddressFamily.InterNetwork) ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6);
                var ep     = new IPEndPoint(_dnsserver, 53);

                // Send the Query and Retrieve the Result
                var requestMade = DateTime.Now;
                var timer       = new Stopwatch();
                timer.Start();
                client.Send(request, request.Length, ep);
                var response = client.Receive(ref ep);
                timer.Stop();

                // Parse the Response
                DnsResponse res = OutputData(response);

                // Format the Request/Response
                var responseString =
                    "->>HEADER<<- " + res + "\nQUESTION SECTION:\n" + res.QuestionsToString() + "\nANSWER SECTION:\n" + res.AnswersToString() + "\n";
                responseString += "Query time: " + timer.ElapsedMilliseconds + " msec\nSERVER: " + _dnsserver + "#53(" + _dnsserver + ")\n";
                responseString += "WHEN: " + String.Format("{0:ddd MMM dd HH:mm:ss} EDT {1:yyyy}", requestMade, requestMade) + "\nMSG SIZE rcvd: " + response.Length;
                return(responseString);
            }
            catch (Exception)
            {
                // Connection Error Occured so return that instead of null valued strings
                return("Error: Unable To Connect To DNS Server");
            }
        }