最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

但確實存在一個內(nèi)網(wǎng)保留地址的定義,它會確保公網(wǎng)IPv4的地址不會分配在“內(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。

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

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

首先寫出該方法的簽名:

bool IsPrivateNetwork(string ipv4Address)
{
}

然后構建測試數(shù)據(jù),顯示期待結果:

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等方式來實現(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;
}

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

輸入結果如下:

[            ] 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

我覺得這種方法……還挺不錯,關鍵都是很直白的API調用,淺顯易懂,如果我是技術負責人,我多半是允許員工寫這種方式的。

另外如果追求“函數(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是個寶庫,除了可以使用IPAddress類輔助做驗證,實現(xià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;
}

該方式的關鍵是借助IPAddress類的GetAddressBytes()方法,即可非常輕松地完全這個驗證——同時代碼更簡單。

如果追求“函數(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——使用正則表達式

這種挺麻煩的,但也沒什么好說的,直接上代碼:

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);

這才是真一行代碼搞定😂

不開玩笑,正則表達式性能其實差很多,比以上兩種方式差得遠——最關鍵的是,我把這正則表達式寫出來,就再也不想維護了😂

總結

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

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

相關文章

  • C#集成DeepSeek模型實現(xiàn)AI私有化的流程步驟(本地部署與API調用教程)

    C#集成DeepSeek模型實現(xiàn)AI私有化的流程步驟(本地部署與API調用教程)

    本文主要介紹了C#集成DeepSeek模型實現(xiàn)AI私有化的方法,包括搭建基礎環(huán)境,如安裝Ollama和下載DeepSeek?R1模型,客戶端?ChatBox?AI?接入?DeepSeek?的步驟,以及?C#?調用?DeepSeek?API?的示例代碼,并總結了其在實際項目中的應用價值,需要的朋友可以參考下
    2025-03-03
  • ZooKeeper 實現(xiàn)分布式鎖的方法示例

    ZooKeeper 實現(xiàn)分布式鎖的方法示例

    這篇文章主要介紹了ZooKeeper 實現(xiàn)分布式鎖的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • 關于C#連接SQL Server時提示用戶登錄失敗的解決方法

    關于C#連接SQL Server時提示用戶登錄失敗的解決方法

    在用C#開發(fā)windows端程序并連接SQL Server時有可能會遇到數(shù)據(jù)庫登錄失敗的問題,下面小編給大家?guī)砹薈#連接SQL Server時提示用戶登錄失敗的解決方法,感興趣的朋友一起看看吧
    2021-11-11
  • C#對DataTable中的某列進行分組

    C#對DataTable中的某列進行分組

    這篇文章介紹了C#對DataTable某列進行分組的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • c#獲取存儲過程返回值示例分享

    c#獲取存儲過程返回值示例分享

    這篇文章主要介紹了C#獲取存儲過程返回值的方法,大家參考使用吧
    2014-01-01
  • 使用C#表達式樹實現(xiàn)對象的深克隆(實例詳解)

    使用C#表達式樹實現(xiàn)對象的深克隆(實例詳解)

    C# 的表達式樹提供了一個強大的機制,可以將代碼以數(shù)據(jù)結構的形式表示出來,使得代碼可以在運行時進行檢查、修改或執(zhí)行,這為動態(tài)查詢生成、代碼優(yōu)化和動態(tài)編程提供了很多可能性,這篇文章主要介紹了使用C#強大的表達式樹實現(xiàn)對象的深克隆,需要的朋友可以參考下
    2024-05-05
  • 利用C#實現(xiàn)獲取當前設備硬件信息

    利用C#實現(xiàn)獲取當前設備硬件信息

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)獲取當前設備硬件信息的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03
  • C#?委托與?Lambda?表達式轉換機制及弱事件模式下的生命周期詳解

    C#?委托與?Lambda?表達式轉換機制及弱事件模式下的生命周期詳解

    本文介紹了C#委托和Lambda表達式的工作原理,包括委托的內(nèi)部結構、Lambda表達式的轉換機制以及弱事件模式下的生命周期管理,感興趣的朋友一起看看吧
    2025-02-02
  • C#正則表達式轉義字符介紹

    C#正則表達式轉義字符介紹

    正則表達式,又稱正規(guī)表示法、常規(guī)表示法。這篇文章主要介紹了C#正則表達式轉義字符介紹的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • C#計算器編寫代碼

    C#計算器編寫代碼

    這篇文章主要為大家分享了C#計算器編寫代碼,供大家參考,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07

最新評論

蓝田县| 彰化县| 武川县| 阿克陶县| 福泉市| 隆林| 图木舒克市| 保定市| 彩票| 庆元县| 什邡市| 宜都市| 郎溪县| 儋州市| 桐乡市| 西乌珠穆沁旗| 毕节市| 张家界市| 平潭县| 景宁| 东莞市| 司法| 宜章县| 方山县| 岳阳县| 无极县| 重庆市| 遂川县| 永昌县| 仙游县| 天门市| 嫩江县| 武城县| 日土县| 黄大仙区| 淮安市| 章丘市| 双桥区| 盈江县| 武川县| 阿拉善右旗|