统一实用功能:获取 IP 和验证 IP 格式
这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战
概述
在Unity中经常会使用到本机电脑的IP,经常用于网络通讯等问题的解决。但是如何获取IP可能有一些同学还不太了解,本期主要了解一下在Unity中如何获取IP,以及如何判断输入的IP是否正确。
获取IP
在Unity中,可能有的人会用NewWork.player.ipAddress
获取IP,但是在Untiy2018.2版本之后,这个方法就已经过时
因此,我们需要使用到新版的获取IP的方法NetworkInterface
,在这里我们首先创建一个枚举类型,用来选择,我们获取电脑中的IPv4地址,还是IPv6地址。
/// <summary>
/// 获取的IP类型
/// </summary>
public enum ADDRESSFAM
{
IPv4, IPv6
}
在写获取IP方法的时候,我们第一步要判断,我们想要获取IP是否是IPv6,这里要重点进行判断,因为有的设备可能不支持IPv6,所以我们需要使用到Socket.OSSupportsIPv6属性 ,指示基础操作系统和网络适配器是否支持 Internet 协议第 6 版 (IPv6)。其有一个只读的方法
public static bool OSSupportsIPv6 { get; }
如果操作系统和网络适配器支持 IPv6 协议,则为 true
;否则为 false
。所以程序我们要进行如下判断
if (Addfam == ADDRESSFAM.IPv6 && !Socket.OSSupportsIPv6)
{
return null;
}
接下来获取本地计算机上的网络接口,通过遍历所有网络接口来获取IP
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
}
NetworkInterface.GetAllNetworkInterfaces()获取的是一个 NetworkInte数组,其中包含描述可用网络接口的对象,如果没有检测到接口,则为空数组。
接下来是指定网络接口的类型NetworkInterfaceType
,NetworkInterfaceType
是一个枚举,只要类型是网络接口使用无线 LAN 连接(IEEE 802.11 标准) 或者是网络接口使用以太网连接。 以太网在 IEEE 802.3 标准中定义,并且OperationalStatus操作状态是UP,我们就可以正常获取IP。
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
NetworkInterfaceType _type1 = NetworkInterfaceType.Wireless80211;
NetworkInterfaceType _type2 = NetworkInterfaceType.Ethernet;
if ((item.NetworkInterfaceType == _type1 || item.NetworkInterfaceType == _type2) && item.OperationalStatus == OperationalStatus.Up)
#endif
其中NetworkInterfaceType枚举的所有网络接口的类型如下,也可参照官网
接下来使用GetIPProperties().UnicastAddresses)
从本机电脑获取稳定单点传播的IP 位址表格,并遍历,从而获取到不同类型的IP地址
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
//IPv4
if (Addfam == ADDRESSFAM.IPv4)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
//IPv6
else if (Addfam == ADDRESSFAM.IPv6)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetworkV6)
{
output = ip.Address.ToString();
}
}
}
到这里获取IP就完成了,文末会有源代码
验证IP格式
在开发中,不知需要用到获取IP,有的时候客户端我们还需要输入IP,但是有的时候可能误操作等会输入错误等,这时候如果直接使用输入的IP可能会造成程序错误,所以这个时候就需要对输入的IP进行格式验证。
首先我们先使用正则表达式(Regex),先验证一下输入的整体格式是否正确,是否是数字.数字.数字.数字的格式
//正则表达式
Regex regex = new Regex("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$");
blnTest = regex.IsMatch(strJudgeString);
我们大家都知道,IP中每一个字段最大不能超过255,所以我们还要对每一个字段进行验证
首先对IP进行截取,这里是通过IP地址中的“.
”进行截取的,截取完还之后,我们在进行一个长度的判断,判断是否是Ip的四个字段的格式
string[] strTemp = strJudgeString.Split(new char[] { '.' }); // textBox1.Text.Split(new char[] { ‘.’ });
//字符串中.的数量,若.的数量小于3,则是非法的ip地址
int nDotCount = strTemp.Length - 1;
if (3 == nDotCount)//判断字符串中.的数量
{
}
接下来就是判断是否有字段大于255
for (int i = 0; i < strTemp.Length; i++)
{
if (Convert.ToInt32(strTemp[i]) > 255)
{
//大于255则提示,不符合IP格式
Debug.Log("不符合IP格式");
_Result = false;
}
}
然后正确返回true
,错误返回false
。到此验证IP就结束了
源代码分享
下面是作者本人搭建的一个小Demo效果图
GitHub下载地址:点击这里跳转下载
写在最后
所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。欢迎大家相互学习进步。本片文章就先写到这里,希望对你能够有所帮助
上一篇: iOS 获取本地 IP 地址方法