public IPAddress[] ResolveHost() { var entry = m_Entry; if (entry == null || entry.Expired) { entry = m_Entry = GetEntry(Host); } return((entry == null) ? EmptyAddresses : (entry.IPAddresses ?? EmptyAddresses)); }
private static RedisIPAddressEntry GetEntry(string host) { if (!host.IsEmpty()) { RedisIPAddressEntry entry; if (!s_DnsEntries.TryGetValue(host, out entry) || entry.Expired) { lock (s_DnsEntries) { if (!s_DnsEntries.TryGetValue(host, out entry) || entry.Expired) { var isIp = false; IPAddress[] ipAddresses = null; if (host.Equals(RedisConstants.LocalHost, StringComparison.OrdinalIgnoreCase)) { if (RedisSocket.OSSupportsIPv4) { isIp = true; ipAddresses = new[] { IPAddress.Parse(RedisConstants.IP4Loopback) }; } else if (RedisSocket.OSSupportsIPv6) { isIp = true; ipAddresses = new[] { IPAddress.Parse(RedisConstants.IP6Loopback) }; } } if (!isIp) { IPAddress ipAddress; isIp = IPAddress.TryParse(host, out ipAddress); ipAddresses = isIp ? new[] { ipAddress } : RedisAsyncEx.GetHostAddressesAsync(host).Result; if (!ipAddresses.IsEmpty()) { isIp = isIp || ipAddresses.All(ip => IPAddress.IsLoopback(ip) || LocalIPs.Contains(ip)); if (ipAddresses.Length > 1) { ipAddresses = ipAddresses .OrderBy((addr) => { return(addr.AddressFamily == AddressFamily.InterNetwork ? -1 : 1); }) .ToArray(); } } } if (entry != null) { entry.SetIPAddresses(ipAddresses, isIp); } else { s_DnsEntries[host] = entry = new RedisIPAddressEntry(host, ipAddresses, isIp); } } } } return(entry); } return(null); }