NetHelper.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Linq;
  3. using System.Net;
  4. using System.Net.NetworkInformation;
  5. using System.Net.Sockets;
  6. namespace Grpc.Extension.Common
  7. {
  8. /// <summary>
  9. /// NetHelper
  10. /// </summary>
  11. public static class NetHelper
  12. {
  13. /// <summary>
  14. /// The ip segment regex
  15. /// </summary>
  16. private const string IPSegmentRegex = @"\d{0,3}";
  17. /// <summary>
  18. /// Gets the ip.
  19. /// </summary>
  20. /// <param name="ipSegment">ip段</param>
  21. /// <returns></returns>
  22. public static string GetIp(string ipSegment)
  23. {
  24. if (string.IsNullOrWhiteSpace(ipSegment))
  25. throw new ArgumentNullException(nameof(ipSegment));
  26. //如果设置的IP支持* 的时候,再去智能的选择ip
  27. if (!ipSegment.Contains("*"))
  28. {
  29. return ipSegment;
  30. }
  31. ipSegment = ipSegment.Replace("*", IPSegmentRegex).Replace(".", "\\.");
  32. var hostAddrs = NetworkInterface.GetAllNetworkInterfaces()
  33. .Where(i => i.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
  34. .SelectMany(i => i.GetIPProperties().UnicastAddresses)
  35. .Select(a => a.Address)
  36. .Where(a => !(a.IsIPv6LinkLocal || a.IsIPv6Multicast || a.IsIPv6SiteLocal || a.IsIPv6Teredo))
  37. .ToList();
  38. foreach (var ip in hostAddrs)
  39. {
  40. if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
  41. && System.Text.RegularExpressions.Regex.IsMatch(ip.ToString(), ipSegment))
  42. {
  43. return ip.ToString();
  44. }
  45. }
  46. throw new Exception($"找不到ipsegement:{ipSegment}匹配的ip, OR No network adapters with an IPv4 address in the system!");
  47. }
  48. /// <summary>
  49. /// 解析ip和port
  50. /// </summary>
  51. /// <param name="serviceAddress"></param>
  52. /// <returns></returns>
  53. public static Tuple<string,int> GetIPAndPort(string serviceAddress)
  54. {
  55. //解析ip
  56. var ipPort = serviceAddress.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
  57. var ip = NetHelper.GetIp(ipPort[0]);
  58. //解析port
  59. var port = 0;
  60. if (ipPort.Length == 2) int.TryParse(ipPort[1], out port);
  61. //随机端口
  62. if (port == 0) port = GetAvailablePort();
  63. return Tuple.Create(ip, port);
  64. }
  65. /// <summary>
  66. /// 获取本地ip
  67. /// </summary>
  68. /// <returns></returns>
  69. public static string GetLocalIp()
  70. {
  71. string localIP;
  72. using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
  73. {
  74. socket.Connect("8.8.8.8", 65530);
  75. IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
  76. localIP = endPoint.Address.ToString();
  77. }
  78. return localIP;
  79. }
  80. /// <summary>
  81. /// 获取可用端口
  82. /// </summary>
  83. /// <returns></returns>
  84. public static int GetAvailablePort()
  85. {
  86. TcpListener l = new TcpListener(IPAddress.Loopback, 0);
  87. l.Start();
  88. int port = ((IPEndPoint)l.LocalEndpoint).Port;
  89. l.Stop();
  90. return port;
  91. }
  92. }
  93. }