using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
namespace FastGithub.Configuration
{
///
/// 监听器
///
public static class GlobalListener
{
private static readonly IPGlobalProperties global = IPGlobalProperties.GetIPGlobalProperties();
private static readonly HashSet tcpListenPorts = GetListenPorts(global.GetActiveTcpListeners);
private static readonly HashSet udpListenPorts = GetListenPorts(global.GetActiveUdpListeners);
///
/// ssh端口
///
public static int SshPort { get; } = GetAvailableTcpPort(22);
///
/// git端口
///
public static int GitPort { get; } = GetAvailableTcpPort(9418);
///
/// http端口
///
public static int HttpPort { get; } = OperatingSystem.IsWindows() ? GetAvailableTcpPort(80) : GetAvailableTcpPort(3880);
///
/// https端口
///
public static int HttpsPort { get; } = OperatingSystem.IsWindows() ? GetAvailableTcpPort(443) : GetAvailableTcpPort(38443);
///
/// 获取已监听的端口
///
///
///
private static HashSet GetListenPorts(Func func)
{
var hashSet = new HashSet();
try
{
foreach (var endpoint in func())
{
hashSet.Add(endpoint.Port);
}
}
catch (Exception)
{
}
return hashSet;
}
///
/// 是可以监听TCP
///
///
///
public static bool CanListenTcp(int port)
{
return tcpListenPorts.Contains(port) == false;
}
///
/// 是可以监听UDP
///
///
///
public static bool CanListenUdp(int port)
{
return udpListenPorts.Contains(port) == false;
}
///
/// 是可以监听TCP和Udp
///
///
///
public static bool CanListen(int port)
{
return CanListenTcp(port) && CanListenUdp(port);
}
///
/// 获取可用的随机Tcp端口
///
///
///
public static int GetAvailableTcpPort(int minPort)
{
return GetAvailablePort(CanListenTcp, minPort);
}
///
/// 获取可用的随机Udp端口
///
///
///
public static int GetAvailableUdpPort(int minPort)
{
return GetAvailablePort(CanListenUdp, minPort);
}
///
/// 获取可用的随机端口
///
///
///
public static int GetAvailablePort(int minPort)
{
return GetAvailablePort(CanListen, minPort);
}
///
/// 获取可用端口
///
///
///
///
///
private static int GetAvailablePort(Func canFunc, int minPort)
{
for (var port = minPort; port < IPEndPoint.MaxPort; port++)
{
if (canFunc(port) == true)
{
return port;
}
}
throw new FastGithubException("当前无可用的端口");
}
}
}