어떻게 C\#로 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 가 랜 인지 검증 하 는 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.