Спасибо, я раньше находил эту статью, но по ней ещё больше вопросов.
Пытался воспроизвести у себя, но ругается на WriteToBytes, WordToBytes, LongWordToBytes, ToBytes, BitsToByte, BytesToWord, ReadFromBytes, ByteToBits.
Попробовал сделать через idDNSServer, но ответ так и не приходит в командную строку.
Выкладываю исходник. DNS2.rar Запускаете его, заходите в командную строку и набираете nslookup google.ru 127.0.0.1 и увидите что в неё (командную строку) не придет ответ от нашего сервера DNS.Вопрос в том, как правильно сформировать ответ что бы он дошел до командной строки.
Если у кого получиться добиться получения ответа в командно строке, напиши пожалуйста. Очень хочется разобраться в вопросе.
Пример приложил.
Запускаете его, заходите в командную строку и набираете nslookup google.ru 127.0.0.1 и увидите что в неё (командную строку) не придет ответ от нашего сервера DNS.
Вопрос в том, как правильно сформировать ответ что бы он дошел до командной строки.
DNS.rar
А как сформировать эти данные для отправки в IdDNSResolver1?
Уже всю голову сломал. =(
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
form1.IdDNSResolver1.Resolve('google.ru');
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort,form1.IdDNSResolver1.ГдеХранитсяОтветВФорматеTBytes);
end;
Я не могу понять как мне сделать пакет для отправки ответа. Как TBytes сформировать.
Или я чего то не так понимаю?
Теперь проблема в следующем. Получив запрос DNS я его отправляю через idDNSResolve и ответ отправить обратно в командную строку.
procedure TForm1.UDPBeforeQuery(ABinding: TIdSocketHandle;
ADNSHeader: TDNSHeader; var ADNSQuery: TIdBytes);
begin
form1.IdDNSResolver1.Resolve('google.ru');
form1.IdDNSResolver1.DNSHeader.AA:=ADNSHeader.AA;
form1.IdDNSResolver1.DNSHeader.ANCount:=ADNSHeader.ANCount;
form1.IdDNSResolver1.DNSHeader.ARCount:=ADNSHeader.ARCount;
form1.IdDNSResolver1.DNSHeader.BitCode:=ADNSHeader.BitCode;
form1.IdDNSResolver1.DNSHeader.ID:=ADNSHeader.ID;
form1.IdDNSResolver1.DNSHeader.NSCount:=ADNSHeader.NSCount;
form1.IdDNSResolver1.DNSHeader.Qr:=1;
form1.IdDNSResolver1.DNSHeader.OpCode:=ADNSHeader.OpCode;
form1.IdDNSResolver1.DNSHeader.QDCount:=ADNSHeader.QDCount;
form1.IdDNSResolver1.DNSHeader.RA:=ADNSHeader.RA;
form1.IdDNSResolver1.DNSHeader.RCode:=ADNSHeader.RCode;
form1.IdDNSResolver1.DNSHeader.RD:=ADNSHeader.RD;
form1.IdDNSResolver1.DNSHeader.TC:=ADNSHeader.TC;
ABinding.SendTo(ABinding.PeerIP,ABinding.PeerPort,form1.IdDNSResolver1.DNSHeader.GenerateBinaryHeader);
end;
Но в командной строке ответ не отображается. Как правильно его отправить?
Добрый день.
Кинул на форму idUDPServer1 и Memo1
В событии idUDPServer1.OnUDPRead написал:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
Memo1.Lines.Add(BytesToString(AData,13));
end;
в событии Form1.OnCreate написал:
procedure TForm1.FormCreate(Sender: TObject);
begin
idUDPServer1.DefaultPort:=53;
idUDPServer1.Active:=True;
end;
Запускаю проект.
Захожу в командную строку Windows и набираю команду:
nslookup google.ru 127.0.0.1
В Memo1 появляется DNS запрос, но что то не так с кодировкой.
Первая строчка должна выглядеть так "1.0.0.127.in-addr.arpa" а вторая и последующие так "google.ru"
Как поправить?