private SRVRecord ReadSRVRecord(ref MemoryStream DNSResponseStream) { SRVRecord srv = new SRVRecord(); byte[] temp = new byte[4]; DNSResponseStream.Read(temp, 0, 4); DNSResponseStream.Read(temp, 0, 4); //DNSResponseStream.Read(temp, 0, 2); byte[] priority = new byte[2]; DNSResponseStream.Read(priority, 0, 2); srv.Priority = (ushort)IPAddress.NetworkToHostOrder((short)BitConverter.ToUInt16(priority, 0)); byte[] weight = new byte[2]; DNSResponseStream.Read(weight, 0, 2); srv.Weight = (ushort)IPAddress.NetworkToHostOrder((short)BitConverter.ToUInt16(weight, 0)); byte[] port = new byte[2]; DNSResponseStream.Read(port, 0, 2); srv.Port = (ushort)IPAddress.NetworkToHostOrder((short)BitConverter.ToUInt16(port, 0)); srv.HostName = ParseHost(ref DNSResponseStream); if (String.IsNullOrEmpty(srv.HostName)) { return(null); } return(srv); }
private List <SRVRecord> ParseResponse(byte[] DNSResponse) { // Read the raw DNS response short answers = (short)(DNSResponse[4] << 8 | DNSResponse[5]); if (answers < 1) { return(null); } List <SRVRecord> records = new List <SRVRecord>(); // We have some answers, so read them // First of all we need to get past the DNS header short pointer = (short)(12 + DNSResponse[12] + 1); while (DNSResponse[pointer] != 0) { pointer += (short)(DNSResponse[pointer] + 1); } pointer += 6; MemoryStream ms = new MemoryStream(DNSResponse, 0, DNSResponse.Length); ms.Position = pointer; while (ms.Position < ms.Length) { SRVRecord record = ReadSRVRecord(ref ms); if (record != null) { records.Add(record); } } ms.Close(); return(records); }