瀏覽代碼

查找IP合并到服务

老九 3 年之前
父節點
當前提交
26868690cb
共有 2 個文件被更改,包括 22 次插入12 次删除
  1. 1 7
      FastGithub.DomainResolve/DomainResolver.cs
  2. 21 5
      FastGithub.DomainResolve/IPAddressStatusService.cs

+ 1 - 7
FastGithub.DomainResolve/DomainResolver.cs

@@ -103,13 +103,7 @@ namespace FastGithub.DomainResolve
                 var dnsEndPoint = keyValue.Key;
                 var oldAddresses = keyValue.Value;
 
-                var hashSet = new HashSet<IPAddress>(oldAddresses);
-                await foreach (var address in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken))
-                {
-                    hashSet.Add(address);
-                }
-
-                var newAddresses = await this.statusService.GetAvailableAddressesAsync(hashSet, dnsEndPoint.Port, cancellationToken);
+                var newAddresses = await this.statusService.GetAvailableAddressesAsync(dnsEndPoint, cancellationToken);
                 if (oldAddresses.SequenceEqual(newAddresses) == false)
                 {
                     this.dnsEndPointAddress[dnsEndPoint] = newAddresses;

+ 21 - 5
FastGithub.DomainResolve/IPAddressStatusService.cs

@@ -24,21 +24,37 @@ namespace FastGithub.DomainResolve
         private readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(5d);
         private readonly IMemoryCache statusCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
 
+        private readonly DnsClient dnsClient;
+
+        /// <summary>
+        /// IP状态服务
+        /// </summary>
+        /// <param name="dnsClient"></param>
+        public IPAddressStatusService(DnsClient dnsClient)
+        {
+            this.dnsClient = dnsClient;
+        }
+
         /// <summary>
         /// 并行获取可连接的IP
         /// </summary>
-        /// <param name="addresses"></param>
-        /// <param name="port"></param>
+        /// <param name="dnsEndPoint"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task<IPAddress[]> GetAvailableAddressesAsync(IEnumerable<IPAddress> addresses, int port, CancellationToken cancellationToken)
+        public async Task<IPAddress[]> GetAvailableAddressesAsync(DnsEndPoint dnsEndPoint, CancellationToken cancellationToken)
         {
-            if (addresses.Any() == false)
+            var addresses = new List<IPAddress>();
+            await foreach (var address in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken))
+            {
+                addresses.Add(address);
+            }
+
+            if (addresses.Count == 0)
             {
                 return Array.Empty<IPAddress>();
             }
 
-            var statusTasks = addresses.Select(item => this.GetStatusAsync(item, port, cancellationToken));
+            var statusTasks = addresses.Select(address => this.GetStatusAsync(address, dnsEndPoint.Port, cancellationToken));
             var statusArray = await Task.WhenAll(statusTasks);
             return statusArray
                 .Where(item => item.Elapsed < TimeSpan.MaxValue)