Exemple #1
0
        public IDnsRecord DecodeRecord(IByteBuffer inputBuffer)
        {
            int    startOffset = inputBuffer.ReaderIndex;
            string name        = DecodeName(inputBuffer);

            int endOffset = inputBuffer.WriterIndex;

            if (endOffset - startOffset < 10)
            {
                inputBuffer.SetReaderIndex(startOffset);
                return(null);
            }

            DnsRecordType type        = DnsRecordType.From(inputBuffer.ReadUnsignedShort());
            var           recordClass = (DnsRecordClass)inputBuffer.ReadUnsignedShort();
            long          ttl         = inputBuffer.ReadUnsignedInt();
            int           length      = inputBuffer.ReadUnsignedShort();
            int           offset      = inputBuffer.ReaderIndex;

            if (endOffset - offset < length)
            {
                inputBuffer.SetReaderIndex(startOffset);
                return(null);
            }

            IDnsRecord record = DecodeRecord(name, type, recordClass, ttl, inputBuffer, offset, length);

            inputBuffer.SetReaderIndex(offset + length);
            return(record);
        }
Exemple #2
0
        public IDnsQuestion DecodeQuestion(IByteBuffer inputBuffer)
        {
            string        name        = DecodeName(inputBuffer);
            DnsRecordType type        = DnsRecordType.From(inputBuffer.ReadUnsignedShort());
            var           recordClass = (DnsRecordClass)inputBuffer.ReadUnsignedShort();

            return(new DefaultDnsQuestion(name, type, recordClass));
        }
        private async Task <IDnsResponse> WriteResponse(TransportMessage message)
        {
            var response    = GetDnsResponse(message);
            var dnsQuestion = GetDnsQuestion(message);
            var ipAddr      = GetIpAddr(message);

            if (response != null && dnsQuestion != null)
            {
                if (ipAddr != null)
                {
                    var buf = Unpooled.WrappedBuffer(ipAddr.GetAddressBytes());
                    response.AddRecord(DnsSection.ANSWER,
                                       new DefaultDnsRawRecord(dnsQuestion.Name, DnsRecordType.A, 100, buf));
                }
                else
                {
                    var dnsMessage = await GetDnsMessage(dnsQuestion.Name, dnsQuestion.Type);

                    if (dnsMessage != null)
                    {
                        foreach (var dnsRecord in dnsMessage.AnswerRecords)
                        {
                            var aRecord = dnsRecord as ARecord;
                            var buf     = Unpooled.Buffer();
                            if (dnsRecord.RecordType == RecordType.Ptr)
                            {
                                var ptrRecord = dnsRecord as PtrRecord;
                                response.AddRecord(DnsSection.ANSWER,
                                                   new DefaultDnsPtrRecord(ptrRecord.Name.ToString(),
                                                                           (DnsRecordClass)(int)ptrRecord.RecordClass, ptrRecord.TimeToLive,
                                                                           ptrRecord.PointerDomainName.ToString()));
                            }

                            if (aRecord != null)
                            {
                                buf = Unpooled.WrappedBuffer(aRecord.Address.GetAddressBytes());
                                response.AddRecord(DnsSection.ANSWER,
                                                   new DefaultDnsRawRecord(dnsQuestion.Name,
                                                                           DnsRecordType.From((int)dnsRecord.RecordType),
                                                                           (DnsRecordClass)(int)aRecord.RecordClass, dnsRecord.TimeToLive, buf));
                            }
                        }
                    }
                }
            }

            return(response);
        }