2009-09-24 19 views

Répondre

56

mon bon ami Alessandro avoir un nice post concernant les opérateurs de bits en C#, vous devriez lire à ce sujet afin que vous sachiez quoi faire.

C'est assez facile. Si vous divisez l'adresse IP qui vous est donnée en binaire, l'adresse réseau est l'adresse IP où tous les bits hôtes (les 0 dans le masque de sous-réseau) sont 0, et la dernière adresse, l'adresse de diffusion, bits sont 1.

Par exemple:

ip 192.168.33.72 mask 255.255.255.192 

11111111.11111111.11111111.11000000 (subnet mask) 
11000000.10101000.00100001.01001000 (ip address) 

les parties en gras sont les bits d'hôte (le reste sont des bits de réseau). Si vous mettez tous les bits d'hôte à 0 sur la propriété intellectuelle, vous obtenez le premier IP possible:

11000000.10101000.00100001.01000000 (192.168.33.64) 

Si vous mettez tous les bits d'hôte à de 1, vous obtenez le dernier IP possible (alias l'adresse de diffusion) :

11000000.10101000.00100001.01111111 (192.168.33.127) 

donc, pour mon exemple:

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

bat moi moi aussi +1 :) – Andrew

+0

C'est la meilleure explication pour calculer les gammes que j'ai lues jusqu'ici. Merci :-) – Anheledir

+0

comment pouvez-vous le savoir/24/25 ou/26? Qu'Est-ce que c'est? –

5

masque Invert (XOR avec ceux), et avec IP. Ajouter 1. Ce sera la plage de départ. OU IP avec masque. Ce sera la plage de fin.

23

Je vais juste afficher le code:

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

Tous les systèmes ne sont pas de petite taille. Vous devriez tester 'BitConverter.IsLittleEndian' pour déterminer si vous devriez utiliser' Reverse() '. – JamieSee

+3

Je suggérerais d'utiliser mask = IPAddress.NetworkToHostOrder (mask) à la place. – sunside

1

Vous le savez peut-être déjà, mais pour vérifier que vous obtenez ce genre de choses, jetez un coup d'œil à http://www.subnet-calculator.com/ - vous pouvez voir comment les bits représentent les parties réseau et hôte de l'adresse. J'ai appris ce raccourci de travailler à la position de déploiement réseau.

8

Cela m'a beaucoup aidé, j'ai pensé que je partagerai ce secret avec tout le monde. Jusqu'à présent, je n'ai pas réussi à trouver un moyen plus simple en ligne que je connaisse.

Par exemple un réseau 192.115.103.64/27, quelle est la portée?

n'oubliez pas que le masque de sous-réseau est 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

de/27 nous savons que (11111111.11111111.11111111.11100000). En comptant à partir de la gauche, c'est le troisième nombre du dernier octet, qui est égal au masque de sous-réseau 255.255.255.224. (Ne comptez pas 0, 0 est/24) de façon 128, 192, 224..etc

Ici où le calcul est disponible en:

utiliser le masque de sous-réseau - masque de sous-réseau du masque de sous-réseau listés ci-dessus dans ce cas, 224-192 = 32

nous savons 192.115.103.64 est le réseau: 64 + 32 = 96 (le prochain réseau/27)

qui signifie que nous avons .0 .32. 96. 128. 160. 64. 224. 192. (ne peut pas utiliser 256 car il est .255)

Voici la gamme 64 - 96.

réseau

est 64.

premier hôte est de 65 ans (premier réseau +1)

hôte dernière est 94. (diffusion -1)

diffusion est 95. (dernier réseau -1)

3

Je recommande l'utilisation de la bibliothèque IPNetwork https://github.com/lduchosal/ipnetwork. Depuis la version 2, il prend également en charge IPv4 et 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); 

Sortie

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 

Amusez-vous!

1

Entrée: 192.168.0.1/25

Le masque est cette partie: /25

Pour trouver l'adresse réseau procédez comme suit:

  • Soustraire le masque de la longueur ip (32 - masque) = 32 - 25 = 7 et prendre ces bits de la droite

  • Dans l'adresse IP donnée Ie: 192.168.0.1 en binaire est: 11111111 11111111 00000000 00000001 Maintenant, en 7 bits de droite '0' 1111111 11111111 00000000 00000000 qui en décimal est: 192.168.0.0 (ce qui est l'adresse réseau)

Pour trouver la première valide/adresse IP utilisable ajouter +1 au réseau adresse Ie: 192.168.0.1

pour trouver la dernière/adresse de diffusion de la procédure est identique à celle de trouver l'adresse de réseau, mais ici, vous devez faire (32 masque) bits de droite à ' 1 '

Ie: 11111111 11111111 00000000 01111111 qui en décimal est 192.168.0.127

Pour trouver la dernière adresse IP valide/utilisable Soustraire 1 à partir de l'adresse de diffusion Ie: 192.168.0.126