using System; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; namespace FastGithub.DomainResolve { /// /// IP延时 /// [DebuggerDisplay("Adddress={Adddress} Elapsed={Elapsed}")] struct IPAddressElapsed { private static readonly TimeSpan maxConnectTimeout = TimeSpan.FromSeconds(5d); /// /// 获取IP地址 /// public IPAddress Adddress { get; } /// /// 获取延时 /// public TimeSpan Elapsed { get; } /// /// IP延时 /// /// /// public IPAddressElapsed(IPAddress adddress, TimeSpan elapsed) { this.Adddress = adddress; this.Elapsed = elapsed; } /// /// 获取连接耗时 /// /// /// /// /// public static async Task ParseAsync(IPAddress address, int port, CancellationToken cancellationToken) { var stopWatch = Stopwatch.StartNew(); try { using var timeoutTokenSource = new CancellationTokenSource(maxConnectTimeout); using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token); using var socket = new Socket(SocketType.Stream, ProtocolType.Tcp); await socket.ConnectAsync(address, port, linkedTokenSource.Token); return new IPAddressElapsed(address, stopWatch.Elapsed); } catch (Exception) { cancellationToken.ThrowIfCancellationRequested(); return new IPAddressElapsed(address, TimeSpan.MaxValue); } finally { stopWatch.Stop(); } } } }