IPAddressItem.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Diagnostics;
  3. using System.Net;
  4. using System.Net.NetworkInformation;
  5. using System.Threading.Tasks;
  6. namespace FastGithub.DomainResolve
  7. {
  8. /// <summary>
  9. /// IP地址项
  10. /// </summary>
  11. [DebuggerDisplay("Address = {Address}, PingElapsed = {PingElapsed}")]
  12. sealed class IPAddressItem : IEquatable<IPAddressItem>
  13. {
  14. private readonly Ping ping = new();
  15. /// <summary>
  16. /// 地址
  17. /// </summary>
  18. public IPAddress Address { get; }
  19. /// <summary>
  20. /// Ping耗时
  21. /// </summary>
  22. public TimeSpan PingElapsed { get; private set; } = TimeSpan.MaxValue;
  23. /// <summary>
  24. /// IP地址项
  25. /// </summary>
  26. /// <param name="address"></param>
  27. public IPAddressItem(IPAddress address)
  28. {
  29. this.Address = address;
  30. }
  31. /// <summary>
  32. /// 发起ping请求
  33. /// </summary>
  34. /// <returns></returns>
  35. public async Task PingAsync()
  36. {
  37. try
  38. {
  39. var reply = await this.ping.SendPingAsync(this.Address);
  40. this.PingElapsed = reply.Status == IPStatus.Success
  41. ? TimeSpan.FromMilliseconds(reply.RoundtripTime)
  42. : TimeSpan.MaxValue;
  43. }
  44. catch (Exception)
  45. {
  46. this.PingElapsed = TimeSpan.MaxValue;
  47. }
  48. }
  49. public bool Equals(IPAddressItem? other)
  50. {
  51. return other != null && other.Address.Equals(this.Address);
  52. }
  53. public override bool Equals(object? obj)
  54. {
  55. return obj is IPAddressItem other && this.Equals(other);
  56. }
  57. public override int GetHashCode()
  58. {
  59. return this.Address.GetHashCode();
  60. }
  61. }
  62. }