Пример #1
0
        // 指定された FQDN に DNS 正引きを行ない、このホストが有している可能性があるグローバル IP アドレスと一致するものがあるかどうか確認する
        async Task <bool> CheckFqdnHasIpAddressOfThisLocalHostAsync(string fqdn, CancellationToken cancel)
        {
            cancel.ThrowIfCancellationRequested();

            // DNS クエリを出してみる
            DnsResponse dnsResults = await TaskUtil.RetryAsync((c) => this.TcpIp.QueryDnsAsync(new DnsGetIpQueryParam(fqdn, DnsQueryOptions.Default, CoresConfig.CertVaultSettings.DnsTimeout), c),
                                                               retryInterval : CoresConfig.CertVaultSettings.DnsTryInterval, tryCount : CoresConfig.CertVaultSettings.DnsTryCount);

            //Con.WriteLine(dnsResults.IPAddressList.Select(x => x.ToString())._Combine(","));

            if (dnsResults.IPAddressList.Where(ip => ip._GetIPAddressType().Bit(IPAddressType.GlobalIp) == false).Any())
            {
                // 応答された DNS 応答の IP アドレスに 1 つでも非グローバル IP アドレスが含まれている場合は、false を返すものとする。
                return(false);
            }

            // このホストが有している可能性があるグローバル IP アドレスの一覧の取得
            HashSet <IPAddress> globalIpList = await this.TcpIp.GetLocalHostPossibleIpAddressListAsync(cancel);

            foreach (IPAddress ip in dnsResults.IPAddressList)
            {
                if (globalIpList.Contains(ip))
                {
                    // 一致するものがあった
                    return(true);
                }
            }

            // 一致するものがなかった
            return(false);
        }
Пример #2
0
        // 1 つの FQDN レコードを処理する非同期関数
        async Task PerformOneAsync(string fqdn, CancellationToken cancel = default)
        {
            // 名前解決を いたします
            DnsResponse response = await TcpIp.QueryDnsAsync(new DnsGetIpQueryParam(fqdn, DnsQueryOptions.Default, 5000), cancel);

            IEnumerable <IPAddress> addressList = response.IPAddressList.Where(x => x.AddressFamily.EqualsAny(AddressFamily.InterNetwork, AddressFamily.InterNetworkV6));

            addressList._DoForEach(addr =>
            {
                $"{fqdn} => {addr}"._Print();
                ResultList.Add(new SniHostnameIpAddressPair(sniHostName: fqdn, ipAddress: addr.ToString()));
            });
        }
        public async Task <IPAddress> GetIpAsync(string hostname, AddressFamily?addressFamily = null, int timeout = -1, CancellationToken cancel = default)
        {
            DnsResponse res = await this.QueryDnsAsync(new DnsGetIpQueryParam(hostname, timeout : timeout));

            IPAddress ret = res.IPAddressList.Where(x => x.AddressFamily == AddressFamily.InterNetwork || x.AddressFamily == AddressFamily.InterNetworkV6)
                            .Where(x => addressFamily == null || x.AddressFamily == addressFamily).FirstOrDefault();

            if (ret == null)
            {
                throw new GetIpAddressFamilyMismatchException($"The hostname \"{hostname}\" has no {addressFamily._ToIPv4v6String()} address.");
            }

            return(ret);
        }