2009-09-24 26 views

Odpowiedz

56

mój dobry przyjaciel Alessandro mają nice post dotyczące operatorów bitów w C#, powinieneś przeczytać o tym, abyś wiedział, co robić.

To całkiem proste. Jeśli zepsujesz IP otrzymany od binarnego, adres sieciowy jest adresem IP, gdzie wszystkie bity hosta (0 w masce podsieci) wynoszą 0, a ostatni adres, adres rozgłoszeniowy, to miejsce, w którym znajduje się cały host bity 1.

Na przykład

ip 192.168.33.72 mask 255.255.255.192 

11111111.11111111.11111111.11000000 (subnet mask) 
11000000.10101000.00100001.01001000 (ip address) 

pogrubiony części jest bity gospodarza (reszta bitów sieci). Po włączeniu wszystkie bity hosta na 0 na IP, pojawi się pierwszy możliwy IP:

11000000.10101000.00100001.01000000 (192.168.33.64) 

Po włączeniu wszystkie bity hosta na 1 użytkownika, a następnie pojawi się ostatni możliwy IP (aka adres broadcast) :

11000000.10101000.00100001.01111111 (192.168.33.127) 

Tak na moim przykładzie:

the network is "192.168.33.64/26": 
Network address: 192.168.33.64 
First usable: 192.168.33.65 (you can use the network address, but generally this is considered bad practice) 
Last useable: 192.168.33.126 
Broadcast address: 192.168.33.127 
+0

pokonaj mnie też to +1 :) – Andrew

+0

To jest najlepsze wytłumaczenie, jak obliczyć te zakresy, które czytałem do tej pory. Dzięki :-) – Anheledir

+0

skąd możesz to wiedzieć/24/25 lub/26? Co to jest? –

5

Odwracanie maski (XOR z nich), i z IP. Dodaj 1. Będzie to zakres początkowy. LUB IP z maską. To będzie zakres końcowy.

23

będę tylko po kod:

IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 1 }); 
int bits = 25; 

uint mask = ~(uint.MaxValue >> bits); 

// Convert the IP address to bytes. 
byte[] ipBytes = ip.GetAddressBytes(); 

// BitConverter gives bytes in opposite order to GetAddressBytes(). 
byte[] maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray(); 

byte[] startIPBytes = new byte[ipBytes.Length]; 
byte[] endIPBytes = new byte[ipBytes.Length]; 

// Calculate the bytes of the start and end IP addresses. 
for (int i = 0; i < ipBytes.Length; i++) 
{ 
    startIPBytes[i] = (byte)(ipBytes[i] & maskBytes[i]); 
    endIPBytes[i] = (byte)(ipBytes[i] | ~maskBytes[i]); 
} 

// Convert the bytes to IP addresses. 
IPAddress startIP = new IPAddress(startIPBytes); 
IPAddress endIP = new IPAddress(endIPBytes); 
+0

Nie wszystkie systemy są małe endian. Powinieneś przetestować 'BitConverter.IsLittleEndian', aby określić, czy powinieneś użyć' Reverse() '. – JamieSee

+3

Proponuję zamiast tego użyć maski = IPAddress.NetworkToHostOrder (maska). – sunside

1

Być może już wiesz o tym, ale aby sprawdzić, czy dostajesz te rzeczy dobrze, spójrz na http://www.subnet-calculator.com/ - możesz zobaczyć, w jaki sposób bity reprezentują sieć i część hosta adresu.

8

Nauczyłem się tego skrótu z pracy na stanowisku rozmieszczania sieci. Bardzo mi to pomogło, pomyślałem, że podzielę się tym sekretem ze wszystkimi. Do tej pory nie udało mi się znaleźć prostszego sposobu, jaki znam online.

Na przykład sieć 192.115.103.64/27, jaki jest zasięg?

ale należy pamiętać, że maska ​​podsieci jest 0, 128, 192, 224, 240, 248, 252, 254, 255

255.255.255.255 11111111.11111111.11111111.11111111/32

255.255.255.254 11111111.11111111.11111111.11111110/31

255.255.255.252 11111111.11111111.11111111.11111100/30

255.255.255.248 11111111.11111111.11111111.11111000/29

255.255.255.240 11111111.11111111.11111111.11110000/28

255.255.255.224 11111111.11111111.11111111.11100000/27

255.255.255.192 11111111.11111111.11111111.11000000/26

255,255. 255,128 11111111.11111111.11111111.10000000/25

255.255.255.0 11111111.11111111.11111111.00000000/24

od/27 wiemy, że (11111111.11111111.11111111.11100000). Licząc od lewej, jest to trzecia liczba od ostatniego oktetu, która wynosi 255.255.255.224 maski podsieci. (Nie licz 0, 0 jest/24) tak, 128, 192, 224..etc

Tu, gdzie matematyka jest w:

użyć maski podsieci - maska ​​podsieci, maski podsieci poprzednia giełdowa w tym przypadku 224-192 = 32

wiemy 192.115.103.64 jest sieć: 64 + 32 = 96 (dla sieci następnej/27)

czyli mamy .0 .32. 64. 96. 128. 160. 192. 224. (256 nie może użyć, ponieważ jest .255)

tu mieści się w zakresie 64 - 96.

sieci 64.

pierwszy gospodarz jest 65. (pierwsza sieć +1)

Ostatnio gospodarz jest 94. (broadcast -1)

transmisji jest 95. (ostatnia sieć -1)

3

Polecam stosowanie IPNetwork Biblioteki https://github.com/lduchosal/ipnetwork. Od wersji 2 obsługuje również protokoły IPv4 i IPv6.

IPv4

IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25"); 

    Console.WriteLine("Network : {0}", ipnetwork.Network); 
    Console.WriteLine("Netmask : {0}", ipnetwork.Netmask); 
    Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast); 
    Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable); 
    Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable); 
    Console.WriteLine("Usable : {0}", ipnetwork.Usable); 
    Console.WriteLine("Cidr : {0}", ipnetwork.Cidr); 

Wyjście

Network : 192.168.0.0 
    Netmask : 255.255.255.128 
    Broadcast : 192.168.0.127 
    FirstUsable : 192.168.0.1 
    LastUsable : 192.168.0.126 
    Usable : 126 
    Cidr : 25 

Miłej zabawy!

1

Wejście: 192.168.0.1/25

Maska jest ta część: /25

Aby znaleźć adres sieciowy należy wykonać następujące czynności:

  • odjąć maskę od długości ip (32 - maska) = 32 - 25 = 7 i weź te bity od prawej

  • W podanym adresie IP Ie: 192.168.0.1 binarnie jest: 11111111 11111111 00000000 00000001 Teraz, biorąc 7 bitów od prawej '0' 1111111 11111111 00000000 00000000 Które w systemie dziesiętnym wynosi: 192.168.0.0 (jest to adres sieciowy)

Aby znaleźć pierwsze ważne/użyteczny adres IP dodać +1 do adresów sieciowych tj 192.168.0.1

aby znaleźć Ostatnia/adres broadcast procedura jest taka sama, jak w przypadku znalezienia adresu sieciowego, ale tutaj trzeba zrobić (32-maska) bitów od prawej do ' 1 '

Ie: 11111111 11111111 00000000 01111111 Które w systemie dziesiętnym jest 192.168.0.127

Aby znaleźć ostatni ważny/użyteczny adres IP odjąć 1 od adresu broadcast IE: 192.168.0.126