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

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

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

Студворк — интернет-сервис помощи студентам
Всем привет. Возникла проблема с таким заданием: получить айпи сайта по его доменному имени с помощью запроса к днс, используя 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2017, 18:34
Ответы с готовыми решениями:

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

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

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

2
3 / 3 / 1
Регистрация: 10.12.2016
Сообщений: 29
26.09.2017, 00:23  [ТС]
Данный код работает для 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
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2023, 14:16
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru