어떻게 C\#로 IP 가 랜 주소 인지 검증 합 니까?

5339 단어 c#ip
얼마 전에[광저우.NET 군]의 고객 이 이 문 제 를 물 었 는데 그들 은 고객 이 입력 한 사이트 가 랜 인지 검증 해 야 한다 고 말 했다.사실 랜 의 IP 는 정 의 된 것 이 아니 라 랜 에 있 으 면 모든 IP 로 설정 할 수 있 습 니 다.
그러나 내부 네트워크 보존 주소 의 정의 가 존재 합 니 다.이 주 소 는 공공 네트워크 IPv 4 의 주소 가'내부 네트워크 보존 주소'에 분배 되 지 않도록 확보 할 것 입 니 다.이 주 소 는 다음 과 같이 정의 합 니 다.
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.225.255.
클 라 이언 트 는 IPv 4 문자열 이 내부 네트워크 에 주 소 를 저장 하 는 지 확인 하고 싶 었 다 고 밝 혔 다.
IPv 4 주소 문자열 이 내부 네트워크 에 주 소 를 유지 하 는 지 검증 하 는 몇 가지 방법 을 생각해 보 자.
먼저 이 방법의 서명 을 작성 하 십시오:

bool IsPrivateNetwork(string ipv4Address)
{
}
그리고 테스트 데 이 터 를 구축 하여 기대 결 과 를 표시 합 니 다.

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
", testData.Select(x => $"[{x.Key,12}] Expected: {x.Value,5},\tActual: {IsPrivateNetwork(x.Key),5}")); Console.WriteLine(output);
방법 1―StartsWith()
이것 은 가장 생각 하기 쉬 운 방법 입 니 다.문자열 의 Substring,StartsWith 등 방식 으로 이 루어 집 니 다.

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 류 사이트 와 C 류 사 이 트 를 검증 할 때 매우 간단 하 다.B 류 네트워크 는 특례 로 이 코드 를 약간 복잡 하 게 만 들 었 기 때문에 몇 개의 문자열 을 더 판단 해 야 한다.코드 가 비교적 복잡 하 다.
입력 결 과 는 다음 과 같 습 니 다:
[            ] 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
저 는 이런 방법 이.......................................................................................
또한'함수 식'을 추구 하면 이렇게 써 서'한 줄 코드'해결 을 실현 할 수 있 습 니 다(효과 가 같 습 니 다).

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 류 를 사용 하여 검증 할 수 있 는 것 을 제외 하고 실현 하기 가 훨씬 간단 합 니 다.

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()방법 을 빌려 이 검증 을 쉽게 완성 할 수 있 는 동시에 코드 가 더욱 간단 하 다 는 것 이다.
'함수 식'프로 그래 밍 을 추구 하면'한 줄'코드 의 버 전 은 다음 과 같 습 니 다(효과 가 같 습 니 다).

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);
이게 진짜 코드 야.😂
농담 하지 않 습 니 다.정규 표현 식 은 성능 이 많이 떨 어 집 니 다.상기 두 가지 방식 보다 훨씬 떨 어 집 니 다.가장 중요 한 것 은 제 가 이 정규 표현 식 을 쓰 면 더 이상 유지 하고 싶 지 않 습 니 다.😂
총결산
속담 에'모든 길 은 로마 로 통한다'고 하 는데 간단 한 임 무 를 완성 하 는 데 서로 다른 방법 이 존재 할 수 있 지만 방법 과 방법 사이 에는 비교적 큰 차이 가 있다.나 는 중요 한 것 은 많이 쓰 고 많이 비교 하 며 많이 체험 하 는 것 이 라 고 생각한다.
이상 은 어떻게 C\#로 IP 가 랜 주소 인지 검증 하 는 지 에 대한 상세 한 내용 입 니 다.C\#IP 가 랜 인지 검증 하 는 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기