///暂时仅限用于PC端
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using UnityEngine;
public static class IPTool
{
#region 属性
#region private
private static List<IPAddress> _ips;
private static List<IPAddress> _ipv4s;
private static List<IPAddress> _ipv6s;
private static List<IPAddress> _subNets;
private static List<IPAddress> _defaultIPGateways;
#endregion
#region public
/// <summary> IP集合 </summary>
public static List<IPAddress> IPs
{
get
{
if (_ips == null)
{
ReadNetworkInterface();
}
return _ips;
}
}
/// <summary> IPv4集合 </summary>
public static List<IPAddress> IPv4s
{
get
{
if (_ipv4s == null)
{
ReadNetworkInterface();
}
return _ipv4s;
}
}
/// <summary> IPv6集合 </summary>
public static List<IPAddress> IPv6s
{
get
{
if (_ipv6s == null)
{
ReadNetworkInterface();
}
return _ipv6s;
}
}
/// <summary> 子网掩码集合 </summary>
public static List<IPAddress> SubNets
{
get
{
if (_subNets == null)
{
ReadNetworkInterface();
}
return _subNets;
}
}
/// <summary> 默认的IP网关集合 </summary>
public static List<IPAddress> DefaultIPGateways
{
get
{
if (_defaultIPGateways == null)
{
ReadNetworkInterface();
}
return _defaultIPGateways;
}
}
/// <summary> 默认网关下的本地唯一ip </summary>
public static string LocalIP
{
get
{
for (int i = 0; i < IPv4s.Count; i++)
{
string ipv4 = IPv4s[i].ToString();
string _3rd = ipv4.Remove(ipv4.LastIndexOf('.'));
for (int j = 0; j < DefaultIPGateways.Count; j++)
{
if (DefaultIPGateways[j].ToString().StartsWith(_3rd))
{
return ipv4;
}
}
}
return "localhost";
}
}
#endregion
#endregion
/// <summary>
/// 读取网络接口信息
/// </summary>
private static void ReadNetworkInterface()
{
//获取所有的网关接口
NetworkInterface[] networkInterfaces =NetworkInterface.GetAllNetworkInterfaces();
foreach (var ni in networkInterfaces)
{
//获取ip接口的属性
IPInterfaceProperties iPInterfaceProperties = ni.GetIPProperties();
//遍历ip接口的所有ip
foreach (var ip in iPInterfaceProperties.UnicastAddresses)
{
//添加ip地址
if (_ips == null) _ips = new List<IPAddress>();
_ips.Add(ip.Address);
//添加ipv4
if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
if (_ipv4s == null) _ipv4s = new List<IPAddress>();
_ipv4s.Add(ip.Address);
}//添加ipv6
else if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
{
if (_ipv6s == null) _ipv6s = new List<IPAddress>();
_ipv6s.Add(ip.Address);
}
//添加子网掩码
if (_subNets == null) _subNets = new List<IPAddress>();
_subNets.Add(ip.IPv4Mask);
//添加默认网关
if (_defaultIPGateways == null) _defaultIPGateways = new List<IPAddress>();
_defaultIPGateways.Add(iPInterfaceProperties.GatewayAddresses[0].Address);
}
}
}
/// <summary>
/// 获取IPv4,unity封装的方式
/// </summary>
/// <returns></returns>
public static List<string> GetIPv4s()
{
//获取ip4的ip地址
List<string> list = new List<string>();
string name = Dns.GetHostName();
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
foreach (IPAddress ipa in ipadrlist)
{
if (ipa.AddressFamily == AddressFamily.InterNetwork)
{
list.Add(ipa.ToString());
}
}
return list;
}
/// <summary>
/// 获取IPv6,unity封装的方式
/// </summary>
/// <returns></returns>
public static List<string> GetIPv6s()
{
//获取ipv6的ip地址
List<string> list = new List<string>();
string name = Dns.GetHostName();
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
foreach (IPAddress ipa in ipadrlist)
{
if (ipa.AddressFamily == AddressFamily.InterNetworkV6)
{
list.Add(ipa.ToString());
}
}
return list;
}
}