欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何用C#驗(yàn)證IP是否為局域網(wǎng)地址

 更新時(shí)間:2020年06月11日 10:33:51   作者:.NET騷操作  
這篇文章主要介紹了如何用C#驗(yàn)證IP是否為局域網(wǎng)地址,文中講解非常細(xì)致,代碼幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下

前一陣子有【廣州.NET群】的客戶問(wèn)起這個(gè)問(wèn)題,說(shuō)他們需要驗(yàn)證客戶輸入的網(wǎng)站是否為局域網(wǎng)。其實(shí)局域網(wǎng)的IP并沒(méi)有確定的定義,只要是局域網(wǎng)中,即可設(shè)置為任何一個(gè)IP。

但確實(shí)存在一個(gè)內(nèi)網(wǎng)保留地址的定義,它會(huì)確保公網(wǎng)IPv4的地址不會(huì)分配在“內(nèi)網(wǎng)保留地址”中,該地址定義如下:

10.0.0.0/8,即10.0.0.0-10.255.255.255;
172.16.0.0/12,即172.16.0.0-172.31.255.255;
192.168.0.0/16,即192.168.0.0-192.168.255.255。

客戶澄清,他確實(shí)就是想驗(yàn)證IPv4字符串是否為內(nèi)網(wǎng)保留地址。

下面我們來(lái)想想幾種驗(yàn)證IPv4地址字符串是否為內(nèi)網(wǎng)保留地址的方法。

首先寫(xiě)出該方法的簽名:

bool IsPrivateNetwork(string ipv4Address)
{
}

然后構(gòu)建測(cè)試數(shù)據(jù),顯示期待結(jié)果:

var testData = new Dictionary<string, bool>
{
	[""] = false, 
	["Not A IP"] = false, 
	["225.5.5.5"] = false,
	["175.10.74.64"] = false,
	["192.168.1.13"] = true,
	["10.10.24.220"] = true, 
	["172.24.1.120"] = true, 
	["172.32.1.120"] = false, 
};

string output = String.Join("\r\n",
	testData.Select(x => $"[{x.Key,12}] Expected: {x.Value,5},\tActual: {IsPrivateNetwork(x.Key),5}"));
	
Console.WriteLine(output);

方法1——StartsWith()

這是最容易想到的方法,用字符串的Substring、StartsWith等方式來(lái)實(shí)現(xiàn):

bool IsPrivateNetwork(string ipv4Address)
{
	if (IPAddress.TryParse(ipv4Address, out _))
	{
		if (ipv4Address.StartsWith("192.168.") || ipv4Address.StartsWith("10."))
		{
			return true;
		}

		if (ipv4Address.StartsWith("172."))
		{
			string seg2 = ipv4Address[4..7];
			if (seg2.EndsWith('.') &&
				String.Compare(seg2, "16.") >= 0 &&
				String.Compare(seg2, "31.") <= 0)
			{
				return true;
			}
		}
	}

	return false;
}

注意這種方式在驗(yàn)證A類網(wǎng)站和C類網(wǎng)站時(shí)都非常簡(jiǎn)單(確實(shí)約大多數(shù)客戶都會(huì)用這兩種)。B類網(wǎng)絡(luò)是個(gè)特例,讓這個(gè)代碼稍復(fù)雜化了,需要多對(duì)幾個(gè)字符串進(jìn)行判斷——導(dǎo)致代碼比較復(fù)雜。

輸入結(jié)果如下:

[            ] Expected: False,  Actual: False
[    Not A IP] Expected: False,  Actual: False
[   225.5.5.5] Expected: False,  Actual: False
[175.10.74.64] Expected: False,  Actual: False
[192.168.1.13] Expected:  True,  Actual:  True
[10.10.24.220] Expected:  True,  Actual:  True
[172.24.1.120] Expected:  True,  Actual:  True
[172.32.1.120] Expected: False,  Actual: False

我覺(jué)得這種方法……還挺不錯(cuò),關(guān)鍵都是很直白的API調(diào)用,淺顯易懂,如果我是技術(shù)負(fù)責(zé)人,我多半是允許員工寫(xiě)這種方式的。

另外如果追求“函數(shù)式”,可能可以寫(xiě)成這個(gè)樣子,實(shí)現(xiàn)“一行代碼”搞定(效果一樣):

bool IsPrivateNetwork2(string ipv4Address) => IPAddress.TryParse(ipv4Address, out _) && (
	ipv4Address.StartsWith("192.168.") ||
	ipv4Address.StartsWith("10.") ||
	ipv4Address.StartsWith("172.") && ipv4Address[6] == '.' && int.Parse(ipv4Address[4..6]) switch
	{
		var x when x >= 16 && x <= 31 => true, 
		_ => false
	}
);

方法2——使用IPAddress

.NET是個(gè)寶庫(kù),除了可以使用IPAddress類輔助做驗(yàn)證,實(shí)現(xiàn)起來(lái)會(huì)簡(jiǎn)單許多:

bool IsPrivateNetwork3(string ipv4Address)
{
	if (IPAddress.TryParse(ipv4Address, out var ip))
	{
		byte[] ipBytes = ip.GetAddressBytes();
		if (ipBytes[0] == 10) return true;
		if (ipBytes[0] == 172 && ipBytes[1] >= 16 && ipBytes[1] <= 31) return true;
		if (ipBytes[0] == 192 && ipBytes[1] == 168) return true;
	}

	return false;
}

該方式的關(guān)鍵是借助IPAddress類的GetAddressBytes()方法,即可非常輕松地完全這個(gè)驗(yàn)證——同時(shí)代碼更簡(jiǎn)單。

如果追求“函數(shù)式”編程,“一行”代碼的版本如下(效果相同):

bool IsPrivateNetwork(string ipv4Address) => IPAddress.TryParse(ipv4Address, out var ip) && ip.GetAddressBytes() switch 
{
	var x when x[0] == 10 => true, 
	var x when x[0] == 172 && x[1] >= 16 && x[1] <= 31 => true, 
	var x when x[0] == 192 && x[1] == 168 => true, 
	_ => false
};

方法3——使用正則表達(dá)式

這種挺麻煩的,但也沒(méi)什么好說(shuō)的,直接上代碼:

bool IsPrivateNetwork(string ipv4Address) => Regex.IsMatch(input, @"(^192\.168\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)|(^172\.([1][6-9]|[2][0-9]|[3][0-1])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)|(^10\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])\.([0-9]|[0-9][0-9]|[0-2][0-5][0-5])$)", RegexOptions.None);

這才是真一行代碼搞定😂

不開(kāi)玩笑,正則表達(dá)式性能其實(shí)差很多,比以上兩種方式差得遠(yuǎn)——最關(guān)鍵的是,我把這正則表達(dá)式寫(xiě)出來(lái),就再也不想維護(hù)了😂

總結(jié)

俗話說(shuō)“條條道路通羅馬”,完成一件簡(jiǎn)單的任務(wù)可能會(huì)存在不同的辦法,但辦法與辦法之間還是有較大的區(qū)別,我覺(jué)得重點(diǎn)的是要多寫(xiě),多比較,多體會(huì)。

以上就是如何用C#驗(yàn)證IP是否為局域網(wǎng)地址的詳細(xì)內(nèi)容,更多關(guān)于C#驗(yàn)證IP是否為局域網(wǎng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • .NET使用IResourceMonitor實(shí)現(xiàn)獲取資源信息

    .NET使用IResourceMonitor實(shí)現(xiàn)獲取資源信息

    在 Microsoft.Extensions.Diagnostics.ResourceMonitoring 包提供了一系列定制 API,專用于監(jiān)視 .NET 應(yīng)用程序的資源利用率,本文將利用IResourceMonitor來(lái)實(shí)現(xiàn)獲取資源狀態(tài)信息,感興趣的可以了解下
    2024-01-01
  • C# Record構(gòu)造函數(shù)的行為更改詳解

    C# Record構(gòu)造函數(shù)的行為更改詳解

    C# 9 中的record類型是僅具有只讀屬性的輕量級(jí)、不可變數(shù)據(jù)類型(或輕量級(jí)類),下面這篇文章主要給大家介紹了關(guān)于C# Record構(gòu)造函數(shù)的行為更改的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C# 實(shí)現(xiàn)微信自定義分享的示例代碼

    C# 實(shí)現(xiàn)微信自定義分享的示例代碼

    這篇文章主要介紹了C# 實(shí)現(xiàn)微信自定義分享的示例代碼,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以自己動(dòng)手嘗試一下
    2024-02-02
  • c# 字符串操作總結(jié)

    c# 字符串操作總結(jié)

    這篇文章主要介紹了c# 字符串操作的相關(guān)知識(shí),文中講解的非常詳細(xì),代碼幫助大家更好的學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06
  • C#使用log4net的3種調(diào)用方法

    C#使用log4net的3種調(diào)用方法

    log4net是一個(gè)用于記錄日志的開(kāi)源框架,它是C#中最常用的日志記錄工具之一,本文給大家介紹了C#使用log4net的3種調(diào)用方法,通過(guò)圖文和代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C#實(shí)現(xiàn)多文件壓縮與解壓功能

    C#實(shí)現(xiàn)多文件壓縮與解壓功能

    這篇文章主要為大家詳細(xì)介紹了如何利用C#語(yǔ)言實(shí)現(xiàn)多文件壓縮與解壓功能,即選擇多個(gè)文件壓縮成ZIP文件和解壓ZIP文件,需要的可以參考一下
    2022-08-08
  • WPF自定義控件實(shí)現(xiàn)ItemsControl魚(yú)眼效果

    WPF自定義控件實(shí)現(xiàn)ItemsControl魚(yú)眼效果

    這篇文章主要為大家詳細(xì)介紹了WPF如何通過(guò)自定義控件實(shí)現(xiàn)ItemsControl魚(yú)眼效果,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2024-01-01
  • C#函數(shù)式程序設(shè)計(jì)之用閉包封裝數(shù)據(jù)的實(shí)現(xiàn)代碼

    C#函數(shù)式程序設(shè)計(jì)之用閉包封裝數(shù)據(jù)的實(shí)現(xiàn)代碼

    如果一個(gè)程序設(shè)計(jì)語(yǔ)言能夠用高階函數(shù)解決問(wèn)題,則意味著數(shù)據(jù)作用域問(wèn)題已十分突出。當(dāng)函數(shù)可以當(dāng)成參數(shù)和返回值在函數(shù)之間進(jìn)行傳遞時(shí),編譯器利用閉包擴(kuò)展變量的作用域,以保證隨時(shí)能得到所需要的數(shù)據(jù)
    2014-03-03
  • unity實(shí)現(xiàn)玻璃效果

    unity實(shí)現(xiàn)玻璃效果

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)玻璃效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#調(diào)用AForge實(shí)現(xiàn)攝像頭錄像的示例代碼

    C#調(diào)用AForge實(shí)現(xiàn)攝像頭錄像的示例代碼

    這篇文章主要介紹了C#調(diào)用AForge實(shí)現(xiàn)攝像頭錄像的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-09-09

最新評(píng)論