/**
* <summary>Creates a response given the entire packet.</summary>
* <remarks>The entire packet must be given, because some name servers take
* advantage of pointers to reduce their size.</remarks>
* <param name="Data">The entire Dns packet.</param>
* <param name="Start">The starting position of the Response.</param>
*/
public Response(MemBlock Data, int Start)
{
int idx = 0;
NameBlob = DnsPacket.RetrieveBlob(Data, Start, out idx);
int type = (Data[idx++] << 8) + Data[idx++];
Type = (DnsPacket.Types)type;
CacheFlush = ((Data[idx] & 0x80) == 0x80) ? true : false;
int rclass = ((Data[idx++] << 8) & 0x7F) + Data[idx++];
Class = (DnsPacket.Classes)rclass;
Ttl = (Data[idx++] << 24);
Ttl |= (Data[idx++] << 16);
Ttl |= (Data[idx++] << 8);
Ttl |= (Data[idx++]);
RdLength = (short)((Data[idx++] << 8) + Data[idx++]);
RDataBlob = Data.Slice(idx, RdLength);
if (Type == DnsPacket.Types.Ptr)
{
try {
Name = DnsPacket.PtrMemBlockToString(NameBlob);
}
catch {
Name = DnsPacket.HostnameMemBlockToString(NameBlob);
}
int End = 0;
RDataBlob = DnsPacket.RetrieveBlob(Data, idx, out End);
RData = DnsPacket.HostnameMemBlockToString(RDataBlob);
}
else if (Type == DnsPacket.Types.A)
{
Name = DnsPacket.HostnameMemBlockToString(NameBlob);
RData = DnsPacket.IPMemBlockToString(RDataBlob);
}
_icpacket = _packet = Data.Slice(Start, idx + RdLength - Start);
}