Volt-
-
Постов
11 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Volt-
-
-
Попробовал сделать через idDNSServer, но ответ так и не приходит в командную строку.
Выкладываю исходник. DNS2.rar
Запускаете его, заходите в командную строку и набираете nslookup google.ru 127.0.0.1 и увидите что в неё (командную строку) не придет ответ от нашего сервера DNS.
Вопрос в том, как правильно сформировать ответ что бы он дошел до командной строки.
Если у кого получиться добиться получения ответа в командно строке, напиши пожалуйста. Очень хочется разобраться в вопросе. -
Rusland
При всем уважении к сообществу, я не знаю как нужно формировать ответ. Прошу помощи у гуру. -
Странно, у меня на Delphi XE7 на эту строчку не ругается.
Попробуйте для теста в ручную забить.
MainForm.IdDNSResolver.Resolve('google.ru') -
Пример приложил.
Запускаете его, заходите в командную строку и набираете nslookup google.ru 127.0.0.1 и увидите что в неё (командную строку) не придет ответ от нашего сервера DNS.
Вопрос в том, как правильно сформировать ответ что бы он дошел до командной строки. -
А как сформировать эти данные для отправки в 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"
Как поправить?
Прочитать DNS запрос в idUDPServer
в TidUDPServer
Опубликовано
Спасибо, я раньше находил эту статью, но по ней ещё больше вопросов.
Пытался воспроизвести у себя, но ругается на WriteToBytes, WordToBytes, LongWordToBytes, ToBytes, BitsToByte, BytesToWord, ReadFromBytes, ByteToBits.