Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
- using System.Net;
- using System.Net.NetworkInformation;
- namespace Salient.Net
- {
- public static class IPUtility
- {
- [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
- public static ushort GetAvailablePort(UInt16 rangeStart, UInt16 rangeEnd, IPAddress ip, bool includeIdlePorts)
- {
- IPGlobalProperties ipProps = IPGlobalProperties.GetIPGlobalProperties();
- Func<IPAddress, bool> isIpAnyOrLoopBack = i => IPAddress.Any.Equals(i) ||
- IPAddress.IPv6Any.Equals(i) ||
- IPAddress.Loopback.Equals(i) ||
- IPAddress.IPv6Loopback.
- Equals(i);
- List<ushort> excludedPorts = new List<ushort>();
- excludedPorts.AddRange(from n in ipProps.GetActiveTcpConnections()
- where
- n.LocalEndPoint.Port >= rangeStart
- && n.LocalEndPoint.Port <= rangeEnd
- &&
- (isIpAnyOrLoopBack(ip) || n.LocalEndPoint.Address.Equals(ip) ||
- isIpAnyOrLoopBack(n.LocalEndPoint.Address))
- && (!includeIdlePorts || n.State != TcpState.TimeWait)
- select (ushort) n.LocalEndPoint.Port);
- excludedPorts.AddRange(from n in ipProps.GetActiveTcpListeners()
- where n.Port >= rangeStart && n.Port <= rangeEnd
- &&
- (isIpAnyOrLoopBack(ip) || n.Address.Equals(ip) || isIpAnyOrLoopBack(n.Address))
- select (ushort) n.Port);
- excludedPorts.AddRange(from n in ipProps.GetActiveUdpListeners()
- where n.Port >= rangeStart && n.Port <= rangeEnd
- &&
- (isIpAnyOrLoopBack(ip) || n.Address.Equals(ip) || isIpAnyOrLoopBack(n.Address))
- select (ushort) n.Port);
- excludedPorts.Sort();
- for (ushort port = rangeStart; port <= rangeEnd; port++)
- {
- if (!excludedPorts.Contains(port))
- {
- return port;
- }
- }
- return 0;
- }
- public static NetworkInterface[] GetActiveNetworkInterfaces()
- {
- return
- (NetworkInterface.GetAllNetworkInterfaces().Where(p => p.OperationalStatus == OperationalStatus.Up)).
- ToArray();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment