2009-06-15 1 views
3

나는 C#에서 다음 달성하기 위해 노력하고있어/NET 2.0 : IP 주소 범위를 얻기 위해 IPAddress 및 IPv4 마스크를 사용하는 방법은 무엇입니까? .

주어진하여 IPAddress 객체 (예를 들어, 192.168.127.100)와 IPv4Mask/서브넷 마스크를 포함하는 다른하여 IPAddress 객체 (예를 들어, 255.255.248.0) IP 주소 범위의 시작과 끝을 계산할 수 있어야합니다.

내가 비트 단위 할 수 있어야한다, 이론적으로

(예,. 서브넷에 주소 범위 통해 A에 대한 루프를 할 노력하고있어) 및하여 IPAddress와 IPStart을 얻을 수있는 서브넷 마스크에 . 그렇다면 IPStart와 반전 된 (NOT'd) SubnetMask에 대해 비트 XOR을 수행하여 IPEnd를 얻을 수 있어야합니다.

IPAddress 개체는 주소를 "long"또는 "byte []"(바이트 배열)로 출력하는 메서드를 제공합니다.

long (비트가 서명 되었기 때문에)에서 비트 연산을 수행하면 유효하지 않은 결과가 생성됩니다. 그리고 IPAddress에서 비트 배열을 바이트 배열로 수행 할 수 없습니다.

EDIT-1 : 좋아요, 배열의 각 바이트를 반복하고 AND, NOT 및 XOR 비트 연산을 수행하면 올바른 결과를 얻을 수 있습니다.

다음 문제는 바이트 [] 배열을 UInt32 또는 long으로 변환 한 후 for 루프를 쉽게 수행 할 수 없다는 것입니다. 따라서 첫 번째 값은 제대로 작동하지만 uint/long을 하나씩 늘리면 IPaddress가 192.168.127.0에서 193.168.127.0으로 증가합니다. 바이트 [] 배열을 uint/long으로 변환하면 바이트가 반전됩니다. 따라서 IPStart에서 IPEnd로 손쉽게 증가시킬 수있는 방법은 없습니다.

어떤 의견이 있습니까?

답변

3

크롤링 두 바이트 [] 배열을 통해 함께, 각 비트 쌍을 비트 단위 비교를 수행하고 다양한 개시에 대한 제 3 바이트 [] 배열 결과 장소. 네트워크 주소 바이트 [] 배열을 크롤링하고 각 비트를 반전하여 와일드 카드 마스크 (역순 서브넷 마스크라고 부름)를 생성 한 다음 서브넷 마스크 대신 와일드 카드 마스크를 사용하여 이전과 같이 프로세스를 반복하여 범위 끝. 범위의 첫 번째 값은 서브넷 네트워크 주소이며 마지막 값은 브로드 캐스트 주소이므로 두 주소가 실제 호스트 주소 범위에 있지 않음을 기억하십시오. 다음은 단계별로 요약 당신의 예는 다음과 같습니다

Address: 192.168.127.100  11000000.10101000.01111 111.01100100 
Netmask: 255.255.248.0 = 21 11111111.11111111.11111 000.00000000 
Wildcard: 0.0.7.255    00000000.00000000.00000 111.11111111 
=> 
Network: 192.168.120.0/21  11000000.10101000.01111 000.00000000 
Broadcast: 192.168.127.255  11000000.10101000.01111 111.11111111 
HostMin: 192.168.120.1   11000000.10101000.01111 000.00000001 
HostMax: 192.168.127.254  11000000.10101000.01111 111.11111110 
+0

비트 당이 작업을 수행 할 필요, 바이트 당 비트 연산 (즉 없습니다 IP/마스크 쌍 당 4 개의 연산) 충분하다. –

+0

비트 단위로 처리하지 말고, 바이트 [] 배열의 4 바이트를 분할하는 추가 단계가 필요하다. 어쩌면 명확하지는 않지만 배열의 각 바이트에 대해 전체 바이트에 대해 비트 연산을 수행한다는 의미입니다. – defines

1

올바른 경로에 있습니다. 배열의 각 바이트를 분리하여 처리하면됩니다.

2

BitConverter을 사용하여 해당 배열을 uint로 설정할 수 있습니다.

이것을 시도 :

uint address = BitConverter.ToUInt32(IPAddress.Parse("192.168.127.100").GetAddressBytes(), 0); 
uint mask = BitConverter.ToUInt32(IPAddress.Parse("255.255.248.0").GetAddressBytes(), 0); 
1

http://ipnetwork.codeplex.com/

샘플 코드 :

var network = IPNetwork.Parse("192.168.1.0/29"); 
var addresses = IPNetwork.ListIPAddress(network); 

foreach (var ip in addresses) { 
    Console.WriteLine("{0}", ip); 
} 
관련 문제