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