Получение 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();
}
}
}