/// <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"); } }