IPAddressElapsed.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Diagnostics;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace FastGithub.DomainResolve
  8. {
  9. /// <summary>
  10. /// IP延时
  11. /// </summary>
  12. [DebuggerDisplay("Adddress={Adddress} Elapsed={Elapsed}")]
  13. struct IPAddressElapsed
  14. {
  15. private static readonly TimeSpan maxConnectTimeout = TimeSpan.FromSeconds(5d);
  16. /// <summary>
  17. /// 获取IP地址
  18. /// </summary>
  19. public IPAddress Adddress { get; }
  20. /// <summary>
  21. /// 获取延时
  22. /// </summary>
  23. public TimeSpan Elapsed { get; }
  24. /// <summary>
  25. /// IP延时
  26. /// </summary>
  27. /// <param name="adddress"></param>
  28. /// <param name="elapsed"></param>
  29. public IPAddressElapsed(IPAddress adddress, TimeSpan elapsed)
  30. {
  31. this.Adddress = adddress;
  32. this.Elapsed = elapsed;
  33. }
  34. /// <summary>
  35. /// 获取连接耗时
  36. /// </summary>
  37. /// <param name="address"></param>
  38. /// <param name="port"></param>
  39. /// <param name="cancellationToken"></param>
  40. /// <returns></returns>
  41. public static async Task<IPAddressElapsed> ParseAsync(IPAddress address, int port, CancellationToken cancellationToken)
  42. {
  43. var stopWatch = Stopwatch.StartNew();
  44. try
  45. {
  46. using var timeoutTokenSource = new CancellationTokenSource(maxConnectTimeout);
  47. using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token);
  48. using var socket = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  49. await socket.ConnectAsync(address, port, linkedTokenSource.Token);
  50. return new IPAddressElapsed(address, stopWatch.Elapsed);
  51. }
  52. catch (Exception)
  53. {
  54. cancellationToken.ThrowIfCancellationRequested();
  55. return new IPAddressElapsed(address, TimeSpan.MaxValue);
  56. }
  57. finally
  58. {
  59. stopWatch.Stop();
  60. }
  61. }
  62. }
  63. }