Получение IP хоста через запрос к DNS серверу - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Возникла проблема с таким заданием: получить айпи сайта по его доменному имени с помощью запроса к днс, используя tcp и сокеты. (стандартную либу dns нельзя юзать!). Код написал, но что-то вообще не работает. В вайершарке какие-то данные приходят,но они без айпи. А в программе вообще отображается что ничего не пришло.
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
 
namespace DNSGetIp
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine("xakep.ru = " + Dns.GetHostAddresses("xakep.ru")[0].ToString());
 
            IPEndPoint IpDNS = new IPEndPoint(new IPAddress(new byte[] { 8, 8, 8, 8 }), 53);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
            s.Connect(IpDNS);
 
            string host1 = "xakep.ru";
            byte[] hostnameLength = new byte[1];
            byte[] hostdomainLength = new byte[1];
 
            byte[] ID = { 0x46, 0x62 };
            byte[] queryType1 = { 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
            byte[] hostname = System.Text.ASCIIEncoding.Default.GetBytes(host1.Split('.')[0]);
            hostnameLength[0] = (byte)hostname.Length;
            byte[] hostdomain = System.Text.ASCIIEncoding.Default.GetBytes(host1.Split('.')[1]);
            hostdomainLength[0] = (byte)hostdomain.Length;
            byte[] queryEnd = { 0x00, 0x00, 0x01, 0x00, 0x01 };
            byte[] dnsQueryString = ID.Concat(queryType1).Concat(hostnameLength).Concat(hostname).Concat(hostdomainLength).Concat(hostdomain).Concat(queryEnd).ToArray();
            s.SendTo(dnsQueryString, dnsQueryString.Length, SocketFlags.None, IpDNS);
 
            byte[] rec = new byte[1024];
            
            s.Receive(rec);
            for (int i = 0; i < 1024; i++)
                Console.Write(rec[i].ToString());
 
            Console.Read();
        }
       
    }
}

Решение задачи: «Получение IP хоста через запрос к DNS серверу»

textual
Листинг программы
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
 
namespace DNSGetIp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("habrahabr.ru  = " + Dns.GetHostAddresses("habrahabr.ru")[0].ToString());
 
            IPEndPoint IpDNS = new IPEndPoint(new IPAddress(new byte[] { 8, 8, 8, 8 }), 53);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
            s.Connect(IpDNS);
 
            string host = "habrahabr.ru";
            byte[] hostnameLength = new byte[1];
            byte[] hostdomainLength = new byte[1];
 
            byte[] ID = { 0x46, 0x62 };
            byte[] queryType = { 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
            byte[] hostname = System.Text.ASCIIEncoding.Default.GetBytes(host.Split('.')[0]);
            hostnameLength[0] = (byte)hostname.Length;
            byte[] hostdomain = System.Text.ASCIIEncoding.Default.GetBytes(host.Split('.')[1]);
            hostdomainLength[0] = (byte)hostdomain.Length;
            byte[] queryEnd = { 0x00, 0x00, 0x01, 0x00, 0x01 };
            byte[] dnsQueryString = ID.Concat(queryType).Concat(hostnameLength).Concat(hostname).Concat(hostdomainLength).Concat(hostdomain).Concat(queryEnd).ToArray();
            s.SendTo(dnsQueryString, dnsQueryString.Length, SocketFlags.None, IpDNS);
 
            byte[] rec = new byte[35+hostname.Length+hostdomain.Length+40];//+40 это костыль, чтоб всегда хватало буфера на ответ (я не нашел зависимости, сколько реально нужной байт)
            
            s.Receive(rec);
 
            int index = Array.FindLastIndex(rec, item => item > 0);
            IPAddress ip = new IPAddress(new byte[] { rec[index - 3], rec[index - 2], rec[index - 1], rec[index] });
            Console.WriteLine(host+" (own request) = " + ip.ToString());
 
            Console.Read();
        }
       
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.5 из 5
Похожие ответы