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