CGC_Codes

Get Available Socket Port

Mar 13th, 2017
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.05 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.CodeAnalysis;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.NetworkInformation;
  7.  
  8. namespace Salient.Net
  9. {
  10.     public static class IPUtility
  11.     {
  12.         [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
  13.         public static ushort GetAvailablePort(UInt16 rangeStart, UInt16 rangeEnd, IPAddress ip, bool includeIdlePorts)
  14.         {
  15.             IPGlobalProperties ipProps = IPGlobalProperties.GetIPGlobalProperties();
  16.  
  17.            
  18.  
  19.             Func<IPAddress, bool> isIpAnyOrLoopBack = i => IPAddress.Any.Equals(i) ||
  20.                                                            IPAddress.IPv6Any.Equals(i) ||
  21.                                                            IPAddress.Loopback.Equals(i) ||
  22.                                                            IPAddress.IPv6Loopback.
  23.                                                                Equals(i);
  24.            
  25.  
  26.             List<ushort> excludedPorts = new List<ushort>();
  27.  
  28.  
  29.            
  30.  
  31.             excludedPorts.AddRange(from n in ipProps.GetActiveTcpConnections()
  32.                                    where
  33.                                        n.LocalEndPoint.Port >= rangeStart
  34.                                        && n.LocalEndPoint.Port <= rangeEnd
  35.                                        &&
  36.                                        (isIpAnyOrLoopBack(ip) || n.LocalEndPoint.Address.Equals(ip) ||
  37.                                         isIpAnyOrLoopBack(n.LocalEndPoint.Address))
  38.                                        && (!includeIdlePorts || n.State != TcpState.TimeWait)
  39.                                    select (ushort) n.LocalEndPoint.Port);
  40.  
  41.             excludedPorts.AddRange(from n in ipProps.GetActiveTcpListeners()
  42.                                    where n.Port >= rangeStart && n.Port <= rangeEnd
  43.                                          &&
  44.                                          (isIpAnyOrLoopBack(ip) || n.Address.Equals(ip) || isIpAnyOrLoopBack(n.Address))
  45.                                    select (ushort) n.Port);
  46.  
  47.             excludedPorts.AddRange(from n in ipProps.GetActiveUdpListeners()
  48.                                    where n.Port >= rangeStart && n.Port <= rangeEnd
  49.                                          &&
  50.                                          (isIpAnyOrLoopBack(ip) || n.Address.Equals(ip) || isIpAnyOrLoopBack(n.Address))
  51.                                    select (ushort) n.Port);
  52.  
  53.             excludedPorts.Sort();
  54.  
  55.  
  56.             for (ushort port = rangeStart; port <= rangeEnd; port++)
  57.             {
  58.                 if (!excludedPorts.Contains(port))
  59.                 {
  60.                     return port;
  61.                 }
  62.             }
  63.  
  64.             return 0;
  65.         }
  66.  
  67.         public static NetworkInterface[] GetActiveNetworkInterfaces()
  68.         {
  69.             return
  70.                 (NetworkInterface.GetAllNetworkInterfaces().Where(p => p.OperationalStatus == OperationalStatus.Up)).
  71.                     ToArray();
  72.         }
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment