Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }