DNS-клиент, который написан с использованием сокетов C - PullRequest
0 голосов
/ 05 марта 2010

Я просто хочу написать клиентскую программу DNS с использованием сокетов C, которая принимает три аргумента: имя запроса (например, имя хоста или имя домена) и тип запроса (A, или NS, или MX) и имя DNS-сервера.Распечатайте ответы в разделе ответов полученной записи DNS.

Я знаю, что есть команда getaddrinfo .. но я просто хочу подключиться к таблице поиска и затем получить имя DNS-сервера ...

, поэтому, когда я даю ввод ./a.out www.google.com A 144.20.190.70

будет отображаться что-то похожее на это:

Сервер: 144.20.190.70 Адрес: 144.20.190.70 # 53

Неофициальный ответ:

Имя: www.google.com

Каноническое имя: www.l.google.com

Имя: www.l.google.com Адрес: 74.125.19.104

Имя: www.l.google.com Адрес: 74.125.19.105

Имя: www.l.google.com Адрес: 74.125.19.106

Имя: www.l.google.com Адрес: 74.125.19.147

Имя: www.l.google.com Адрес: 74.125.19.99

Имя: www.l.google.com Адрес: 74.125.19.103

1 Ответ

2 голосов
/ 12 октября 2010

Да, вам нужно увидеть класс Bev.net.dns, который Роб-Филпот создал для .net

Нажмите здесь

Построение запросов для отправки на DNS-серверы не легко, но как только вы можете получить ответ от сервера, вам нужно отправить его обратно в браузер, и это бит, на котором я застрял.

Я слушаю порт 53 / UDP, получаю запрос, отправляю его на DNS-сервер и получаю действительный ответ, но затем отправляю его обратно в браузер, используя порт удаленного клиента в качестве UDP, но браузер не будет, кроме ответить.

Код Робса очень прост в использовании, как показано ниже «Resolver.Lookup», и мне просто нужно добавить немного, чтобы исходный байтовый массив, отправленный с DNS-сервера как сохраненный в Resolver.Message, был готов отправить обратно в браузер. .

    public void Listen()
    {
        receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp );
        receiveEndPoint = new IPEndPoint(IPAddress.Any, receivePort); receiveSocket.Bind(receiveEndPoint); 
        receivePort = (receiveSocket.LocalEndPoint as IPEndPoint).Port; 
        receiveBuffer = new byte[BufferSize]; 
        receiveAsyncResult = receiveSocket.BeginReceiveFrom(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None, ref receiveEndPoint, new AsyncCallback(NetworkMessageReceivedCallback), receiveSocket);
    }


    public void NetworkMessageReceivedCallback(IAsyncResult asyncResult)
    {
        EndPoint remoteEndPoint = null;            
        byte[] bytes = null;                        
        remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); //Will contain the clients port                
        int bytesRead = receiveSocket.EndReceiveFrom(asyncResult, ref remoteEndPoint);                                              
        bytes = new Byte[bytesRead];                
        Buffer.BlockCopy(receiveBuffer, 0, bytes, 0, bytesRead);
       //string ip = "208.67.222.222";
       string ip = "192.168.1.254";
       IPAddress dnsServer = IPAddress.Parse(ip);
       Response R = Resolver.Lookup(bytes, dnsServer);
       receiveSocket.SendTo(R.Message , remoteEndPoint);//127.0.0.1
       receiveSocket.Close();
   Listen();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...