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

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

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

Всем привет. Возникла проблема с таким заданием: получить айпи сайта по его доменному имени с помощью запроса к днс, используя tcp и сокеты. (стандартную либу dns нельзя юзать!). Код написал, но что-то вообще не работает. В вайершарке какие-то данные приходят,но они без айпи. А в программе вообще отображается что ничего не пришло.
Листинг программы
  1. using System;
  2. using System.Linq;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. namespace DNSGetIp
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. //Console.WriteLine("xakep.ru = " + Dns.GetHostAddresses("xakep.ru")[0].ToString());
  12. IPEndPoint IpDNS = new IPEndPoint(new IPAddress(new byte[] { 8, 8, 8, 8 }), 53);
  13. Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  14. s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
  15. s.Connect(IpDNS);
  16. string host1 = "xakep.ru";
  17. byte[] hostnameLength = new byte[1];
  18. byte[] hostdomainLength = new byte[1];
  19. byte[] ID = { 0x46, 0x62 };
  20. byte[] queryType1 = { 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  21. byte[] hostname = System.Text.ASCIIEncoding.Default.GetBytes(host1.Split('.')[0]);
  22. hostnameLength[0] = (byte)hostname.Length;
  23. byte[] hostdomain = System.Text.ASCIIEncoding.Default.GetBytes(host1.Split('.')[1]);
  24. hostdomainLength[0] = (byte)hostdomain.Length;
  25. byte[] queryEnd = { 0x00, 0x00, 0x01, 0x00, 0x01 };
  26. byte[] dnsQueryString = ID.Concat(queryType1).Concat(hostnameLength).Concat(hostname).Concat(hostdomainLength).Concat(hostdomain).Concat(queryEnd).ToArray();
  27. s.SendTo(dnsQueryString, dnsQueryString.Length, SocketFlags.None, IpDNS);
  28. byte[] rec = new byte[1024];
  29. s.Receive(rec);
  30. for (int i = 0; i < 1024; i++)
  31. Console.Write(rec[i].ToString());
  32. Console.Read();
  33. }
  34. }
  35. }

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

textual
Листинг программы
  1. using System;
  2. using System.Linq;
  3. using System.Net;
  4. using System.Net.Sockets;
  5.  
  6. namespace DNSGetIp
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             Console.WriteLine("habrahabr.ru  = " + Dns.GetHostAddresses("habrahabr.ru")[0].ToString());
  13.  
  14.             IPEndPoint IpDNS = new IPEndPoint(new IPAddress(new byte[] { 8, 8, 8, 8 }), 53);
  15.             Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  16.             s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
  17.             s.Connect(IpDNS);
  18.  
  19.             string host = "habrahabr.ru";
  20.             byte[] hostnameLength = new byte[1];
  21.             byte[] hostdomainLength = new byte[1];
  22.  
  23.             byte[] ID = { 0x46, 0x62 };
  24.             byte[] queryType = { 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  25.             byte[] hostname = System.Text.ASCIIEncoding.Default.GetBytes(host.Split('.')[0]);
  26.             hostnameLength[0] = (byte)hostname.Length;
  27.             byte[] hostdomain = System.Text.ASCIIEncoding.Default.GetBytes(host.Split('.')[1]);
  28.             hostdomainLength[0] = (byte)hostdomain.Length;
  29.             byte[] queryEnd = { 0x00, 0x00, 0x01, 0x00, 0x01 };
  30.             byte[] dnsQueryString = ID.Concat(queryType).Concat(hostnameLength).Concat(hostname).Concat(hostdomainLength).Concat(hostdomain).Concat(queryEnd).ToArray();
  31.             s.SendTo(dnsQueryString, dnsQueryString.Length, SocketFlags.None, IpDNS);
  32.  
  33.             byte[] rec = new byte[35+hostname.Length+hostdomain.Length+40];//+40 это костыль, чтоб всегда хватало буфера на ответ (я не нашел зависимости, сколько реально нужной байт)
  34.            
  35.             s.Receive(rec);
  36.  
  37.             int index = Array.FindLastIndex(rec, item => item > 0);
  38.             IPAddress ip = new IPAddress(new byte[] { rec[index - 3], rec[index - 2], rec[index - 1], rec[index] });
  39.             Console.WriteLine(host+" (own request) = " + ip.ToString());
  40.  
  41.             Console.Read();
  42.         }
  43.        
  44.     }
  45. }

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


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

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

12   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы