com.alicizax.unity/Runtime/Utility/Utility.Net.cs
2025-03-24 13:16:51 +08:00

136 lines
4.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace AlicizaX
{
public static partial class Utility
{
/// <summary>
/// 网络相关的对象工具类
/// </summary>
public static class Net
{
/// <summary>
/// 获取第一个可用的端口号
/// </summary>
/// <param name="startPort">起始端口号</param>
/// <param name="maxPort">结束端口号</param>
/// <returns></returns>
public static int GetFirstAvailablePort(int startPort = 667, int maxPort = 65535)
{
for (int i = startPort; i < maxPort; i++)
{
if (PortIsAvailable(i)) return i;
}
return -1;
}
/// <summary>
/// 获取操作系统已用的端口号
/// </summary>
/// <returns></returns>
public static List<int> PortIsUsed()
{
//获取本地计算机的网络连接和通信统计数据的信息
var ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
//返回本地计算机上的所有Tcp监听程序
var ipsTcp = ipGlobalProperties.GetActiveTcpListeners();
//返回本地计算机上的所有UDP监听程序
var ipsUDP = ipGlobalProperties.GetActiveUdpListeners();
//返回本地计算机上的Internet协议版本4(IPV4 传输控制协议(TCP)连接的信息。
var tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();
var allPorts = new List<int>();
foreach (var ep in ipsTcp)
{
allPorts.Add(ep.Port);
}
foreach (var ep in ipsUDP)
{
allPorts.Add(ep.Port);
}
foreach (var conn in tcpConnInfoArray)
{
allPorts.Add(conn.LocalEndPoint.Port);
}
return allPorts;
}
/// <summary>
/// 检查指定端口是否已用
/// </summary>
/// <param name="port"></param>
/// <returns></returns>
public static bool PortIsAvailable(int port)
{
var isAvailable = true;
var portUsed = PortIsUsed();
foreach (int p in portUsed)
{
if (p == port)
{
isAvailable = false;
break;
}
}
return isAvailable;
}
/// <summary>
/// 获取本机ip地址
/// </summary>
/// <returns></returns>
public static string GetIP()
{
var hostName = Dns.GetHostName();
var iPHostEntry = Dns.GetHostEntry(hostName);
foreach (var address in iPHostEntry.AddressList)
{
if (address.AddressFamily == AddressFamily.InterNetwork)
{
return address.ToString();
}
}
return string.Empty;
}
public static (AddressFamily, string) GetIPv6Address(string host)
{
var addresses = Dns.GetHostAddresses(host);
foreach (var ipAddress in addresses)
{
if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
{
return (AddressFamily.InterNetworkV6, ipAddress.ToString());
}
}
foreach (var ipAddress in addresses)
{
if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
{
return (AddressFamily.InterNetwork, ipAddress.ToString());
}
}
return (AddressFamily.InterNetwork, host);
}
}
}
}