176 lines
5.6 KiB
C#
176 lines
5.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Net;
|
|
using System.Net.NetworkInformation;
|
|
using System.Net.Sockets;
|
|
using UnityEngine;
|
|
|
|
namespace AlicizaX
|
|
{
|
|
public static partial class Utility
|
|
{
|
|
/// <summary>
|
|
/// 网络相关的对象工具类
|
|
/// </summary>
|
|
public static class Net
|
|
{
|
|
/// <summary>
|
|
/// 获取本地 IP 列表。
|
|
/// </summary>
|
|
public static string[] GetAddressIPs()
|
|
{
|
|
var list = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
|
|
string[] addressIPs = new string[list.Length];
|
|
for (int index = 0; index < list.Length; index++)
|
|
{
|
|
IPAddress address = list[index];
|
|
addressIPs[index] = address.ToString();
|
|
}
|
|
|
|
return addressIPs;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 是否有网络连接。
|
|
/// </summary>
|
|
public static bool IsReachable()
|
|
{
|
|
return Application.internetReachability != NetworkReachability.NotReachable;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 是否为局域网或 WiFi 网络。
|
|
/// </summary>
|
|
public static bool IsWifi()
|
|
{
|
|
return Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 是否为移动网络。
|
|
/// </summary>
|
|
public static bool IsViaCarrierData()
|
|
{
|
|
return Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork;
|
|
}
|
|
/// <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);
|
|
}
|
|
}
|
|
}
|
|
}
|