// 指定された 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); }
// 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); }