Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 3 / 1
Регистрация: 10.12.2016
Сообщений: 29
1

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

23.09.2017, 18:34. Показов 1361. Ответов 2

Author24 — интернет-сервис помощи студентам
Всем привет. Возникла проблема с таким заданием: получить айпи сайта по его доменному имени с помощью запроса к днс, используя tcp и сокеты. (стандартную либу dns нельзя юзать!). Код написал, но что-то вообще не работает. В вайершарке какие-то данные приходят,но они без айпи. А в программе вообще отображается что ничего не пришло.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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();
        }
       
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2017, 18:34
Ответы с готовыми решениями:

Получение DNS имени хоста
Всем добрый день. В общем написал небольшую программку,где в текстовые поля вводится диапазон IP...

Запрос к HTTP серверу через браузер и telnet
Есть простой самописный HTTP сервер, который слушает коннекты по определённому порту х. Нужно: 1....

Запрос другому серверу и получение даных
Есть сервис для формирования формул используя формат LaTeX. Там можно получить картинку формулы с...

Post запрос к серверу и получение ответа
Здравствуйте, мне нужно, чтобы программа отправляла запрос серверу, получала данные в виде строки и...

2
3 / 3 / 1
Регистрация: 10.12.2016
Сообщений: 29
26.09.2017, 00:23  [ТС] 2
Данный код работает для UDP. Как сделать для TCP хз.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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();
        }
       
    }
}
0
7 / 5 / 2
Регистрация: 06.10.2018
Сообщений: 183
24.09.2023, 14:16 3
C#
1
2
3
4
5
6
var googleIps = await Dns.GetHostAddressesAsync("habrahabr.ru");
foreach (var ip in googleIps)
{
    Console.WriteLine(ip);
}
Console.ReadKey();
0
24.09.2023, 14:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2023, 14:16
Помогаю со студенческими работами здесь

Перенаправление DNS запросов из локальной сети к DNS серверу провайдера
Добрый день! Необходимо настроить простейший инет шлюз на freebsd и PF. Может кто сможет...

Как можно продиагностировать DNS запросы, включая обращения к кэшу, и сами запросы от DNS клиента к серверу?
Добрый день! Подскажите пожалуйста, каким образом можно в операционной системе MS Windows 7...

Получение имени хоста по IP адресу
Есть IIS проектик. Крутится под PWS на Win98. Все это в интрасети,прокси и анонимы отсекаются и...

Получение PartialView через get запрос jquery
Здравствуйте При попытке получить PartialView через Get запрос я получаю ошибку, подскажите где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru