DnsQueryBody ParseDnsQueryBody(byte[] buffer, int beginIndex, ref int parseCount) { DnsQueryBody queryBody = new DnsQueryBody(); // get the length of the query name int nameLength = 0; int sectionLen, index = beginIndex; while ((sectionLen = buffer[index]) != 0) { nameLength += sectionLen + 1; index += sectionLen + 1; } nameLength += 1; // add the count of the last '0' index++; byte[] nameBuffer = new byte[nameLength]; Array.Copy(buffer, beginIndex, nameBuffer, 0, nameLength); queryBody.queryName = nameBuffer; queryBody.queryType = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, index)); index += sizeof(Int16); queryBody.queryClass = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, index)); index += sizeof(Int16); parseCount = index - beginIndex; return(queryBody); }
public void ExecuteTest() { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); byte[] buffer = PrepareDnsQuery(); socket.SendTo(buffer, dnsServerEndPoint); // Receive the response from the server byte[] dnsData = new byte[1000]; EndPoint endPoint = (EndPoint)dnsServerEndPoint; socket.ReceiveFrom(dnsData, ref endPoint); int index = 0, count = 0; DnsDiagramHead diagramHead = ParseResponseDiagramHead(dnsData, index, ref count); index += count; #region ErrorHandling if (diagramHead.resRecNum == 0) { Console.WriteLine("Could not resolve the host name."); return; } // rcode nonzero means error is found if ((diagramHead.flag & 0x08) != 0) { Console.WriteLine("Dns Error! rcode =%d", (diagramHead.flag & 0x08)); return; } #endregion // Make sure queryNum=1 Debug.Assert(diagramHead.queryNum == 1); DnsQueryBody queryBody = ParseDnsQueryBody(dnsData, index, ref count); index += count; Console.WriteLine("Dns Query Name: " + queryBody.GetQueryNameString()); int resRecordCount = diagramHead.resRecNum; DnsResourceRecord[] resourceRecords = new DnsResourceRecord[resRecordCount]; for (int i = 0; i < resRecordCount; i++) { resourceRecords[i] = ParseDnsResourceRecord(dnsData, index, ref count); index += count; } foreach (DnsResourceRecord record in resourceRecords) { Console.WriteLine("Result is " + record.GetResourceContentString()); } Console.WriteLine("\nPress any key to exit."); Console.ReadKey(); }