Как подключиться к DNS-серверу, используя ARSoft.Tools.Net.Core DNSClient, IP-адрес и номер порта - PullRequest
0 голосов
/ 13 мая 2019

У меня есть 2 DNS-сервера (domainserverwithport.com:5356 и domainserverwithoutport.com), к которым я подключаюсь для запроса поиска.У одного есть номер порта, а у другого нет.

Тот, у кого нет номера порта, подключается и получает ответ на запрос.Но второй ничего не возвращает.И при использовании ARSoft.Tools.Net.Core, я не мог видеть вариант создания нового DNSClient с IP-адресом и номером порта.Пожалуйста, есть ли способ обойти это?

Я сделал следующее для DNS-сервера, у которого нет номера порта.

var ip = Dns.GetHostEntry("domainserverwithoutport.com");
            Console.WriteLine(ip.AddressList[0]);
            var newIp = ip.AddressList[0];

       IPAddress iPAddress = IPAddress.Parse(newIp.ToString());
  var result = EnumDnsQuery(iPAddress.ToString(), "8.7.4.3.9.5.3.1.0.9.4.3.2.e164.arpa.4.couretech.0ceed", RecordType.Naptr, 0, 5000);

и метод EnumDnsQuery

public static EnumDnsResponse EnumDnsQuery(string serverIp, string domain,
            RecordType recordType, int maximumRetries = 0, int queryTimeout = QUERY_TIMEOUT_MILLISECONDS)
        {

            int retriesToUse = maximumRetries > 0 ? maximumRetries : 0;
            DnsMessage dnsMessage = null;
            TimeSpan duration = TimeSpan.Zero;



            IPAddress ipAddress = IPAddress.Parse(serverIp);

            DomainName domainName = DomainName.Parse(domain);

            var stopwatch = new Stopwatch();
            DnsClient client = new DnsClient(ipAddress, queryTimeout);

            int attempts = 0;

            stopwatch.Start();
            while (dnsMessage == null && attempts <= retriesToUse)
            {
                attempts++;
                dnsMessage = client.Resolve(domainName, recordType);
            }
            stopwatch.Stop();

            string rawMessage = string.Empty;

            if (dnsMessage != null && recordType == RecordType.Naptr)
            {
                var naptrRecords = dnsMessage.AnswerRecords.Where(x => x.GetType() == typeof(NaptrRecord))
                    .Select(x => (NaptrRecord)x)
                    .Where(x => x.Services.Equals("E2U+pstn:tel"))
                    .OrderByDescending(x => x.Order);

                var naptrRecord = naptrRecords.FirstOrDefault();
                if (naptrRecord != null)
                    rawMessage = naptrRecord.RegExp.Trim('!');
            }
            else if (dnsMessage != null && recordType == RecordType.Txt)
            {
                var txtRecords = dnsMessage.AnswerRecords.Where(x => x.GetType() == typeof(TxtRecord))
                   .Select(x => (TxtRecord)x);

                var txtRecord = txtRecords.FirstOrDefault();
                if (txtRecord == null)
                    rawMessage = txtRecord.TextData.Trim('!');
            }

            return new EnumDnsResponse(
                dnsMessage: dnsMessage,
                rawMessage: rawMessage,
                totalDuration: stopwatch.Elapsed,
                attempts: attempts);
        }

Приведенный выше код возвращает сообщение DnsMessage.Но когда я делаю то же самое для другого сервера домена, который ожидает номер порта, DnsMessage становится нулевым. Пожалуйста, есть ли способ обойти это?

1 Ответ

0 голосов
/ 13 мая 2019

Читая код на https://github.com/mccj/ARSoft.Tools.Net.Core/blob/master/ARSoft.Tools.Net.Core/Dns/DnsClientBase.cs, вы можете видеть, что есть внутренний конструктор, который принимает номер порта ...

А здесь https://github.com/mccj/ARSoft.Tools.Net.Core/blob/master/ARSoft.Tools.Net.Core/Dns/DnsClient.cs в строке 81 мы можем увидетьПример доступного конструктора, который обращается к внутреннему, передавая 53 как жестко закодированное значение (т.е. вы не можете установить номер порта в вашем коде, если вы используете предоставленный DnsClient)

Там нетпохоже, это способ изменить номер порта либо при создании экземпляра DnsClient, либо впоследствии (например, через свойство), и вы не можете самостоятельно создать подкласс DnsClientBase, потому что соответствующий конструктор, который вам нужен, является внутренним для другой сборки и недоступен.Если вы отчаянно пытаетесь это сделать, вам, возможно, придется клонировать репозиторий ARSoft.Tools.Net.Core самостоятельно и добавить конструктор в DnsClient

Стоит отметить, что настройка порта распространяется на клиента;нет понятия наличия сервера A на порту 53 и сервера B на порту 5353, и оба сервера известны одному и тому же клиенту.Порт фиксируется во время создания экземпляра и применяется ко всем серверам в известном списке для этого DnsClientBase

. Вы также можете получить некоторое расстояние от записи автору пакета и запроса дополнительной информации о том, почему код устроентаким образом, поскольку кажется, что намеренно трудно использовать пользовательский порт снаружи, но внутри все необходимые внутренности необходимы для того, чтобы сделать его переменным параметром

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...