procedure TSimpleDNSServer.SendDNSPackage(DNSPackage: TDNSPackage; Binding: TIdSocketHandle);
var
Bytes: TBytes;
Flags, Flags2: Array[0..7] of Boolean;
i: Integer;
Position: Integer;
begin
SetLength(Bytes, SizeOfPackage(DNSPackage));
WriteToBytes(Bytes, WordToBytes(DNSPackage.Header.ID), 0);
with DNSPackage.Header do
begin
Flags[0] := QR;
Flags[1] := OPCODE[0];
Flags[2] := OPCODE[1];
Flags[3] := OPCODE[2];
Flags[4] := OPCODE[3];
Flags[5] := AA;
Flags[6] := TC;
Flags[7] := RD;
Flags2[0] := RA;
Flags2[1] := Z[0];
Flags2[2] := Z[1];
Flags2[3] := Z[2];
Flags2[4] := RCODE[0];
Flags2[5] := RCODE[1];
Flags2[6] := RCODE[2];
Flags2[7] := RCODE[3];
end;
Bytes[2] := BitsToByte(Flags);
Bytes[3] := BitsToByte(Flags2);
WriteToBytes(Bytes, WordToBytes(DNSPackage.Header.QDCOUNT), 4);
WriteToBytes(Bytes, WordToBytes(DNSPackage.Header.ANCOUNT), 6);
WriteToBytes(Bytes, WordToBytes(DNSPackage.Header.NSCOUNT), 8);
WriteToBytes(Bytes, WordToBytes(DNSPackage.Header.ARCOUNT), 10);
Position := 12;
for i := 0 to DNSPackage.Header.QDCOUNT-1 do
begin
WriteToBytes(Bytes, ToBytes(DNSPackage.Question[i].QNAME), Position);
Inc(Position, Length(DNSPackage.Question[i].QNAME));
WriteToBytes(Bytes, WordToBytes(DNSPackage.Question[i].QTYPE), Position);
Inc(Position, 2);
WriteToBytes(Bytes, WordToBytes(DNSPackage.Question[i].QCLASS), Position);
Inc(Position, 2);
end;
for i := 0 to DNSPackage.Header.ANCOUNT-1 do
begin
Bytes[Position] := DNSPackage.Answer[i].NAME[0];
inc(Position);
Bytes[Position] := DNSPackage.Answer[i].NAME[1];
inc(Position);
WriteToBytes(Bytes, WordToBytes(DNSPackage.Answer[i].RTYPE), Position);
Inc(Position, 2);
WriteToBytes(Bytes, WordToBytes(DNSPackage.Answer[i].RCLASS), Position);
Inc(Position, 2);
WriteToBytes(Bytes, LongWordToBytes(DNSPackage.Answer[i].TTL), Position);
Inc(Position, 4);
WriteToBytes(Bytes, WordToBytes(DNSPackage.Answer[i].RDLENGTH), Position);
Inc(Position, 2);
WriteToBytes(Bytes, DNSPackage.Answer[i].RDATA, Position);
Inc(Position, DNSPackage.Answer[i].RDLENGTH);
end;
Binding.SendTo(Binding.PeerIP, Binding.PeerPort, Bytes);
end;