欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

统一实用功能:获取 IP 和验证 IP 格式

最编程 2024-07-06 19:27:10
...

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战

概述

在Unity中经常会使用到本机电脑的IP,经常用于网络通讯等问题的解决。但是如何获取IP可能有一些同学还不太了解,本期主要了解一下在Unity中如何获取IP,以及如何判断输入的IP是否正确。

获取IP

在Unity中,可能有的人会用NewWork.player.ipAddress获取IP,但是在Untiy2018.2版本之后,这个方法就已经过时

image.png 因此,我们需要使用到新版的获取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数组,其中包含描述可用网络接口的对象,如果没有检测到接口,则为空数组。

接下来是指定网络接口的类型NetworkInterfaceTypeNetworkInterfaceType是一个枚举,只要类型是网络接口使用无线 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枚举的所有网络接口的类型如下,也可参照官网 image.pngimage.png

接下来使用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效果图 0831.gif

GitHub下载地址:点击这里跳转下载

写在最后

所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。欢迎大家相互学习进步。本片文章就先写到这里,希望对你能够有所帮助

推荐阅读