Получение 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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д