2009-09-24 15 views

Respuesta

56

mi buen amigo Alessandro tiene un nice post con respecto a los operadores de bits en C#, debe leer al respecto para saber qué hacer.

Es bastante fácil. Si desglosa la IP que le ha dado en binario, la dirección de red es la dirección IP donde todos los bits de host (los 0 en la máscara de subred) son 0, y la última dirección, la dirección de difusión, es donde todo el host bits son 1.

Por ejemplo:

ip 192.168.33.72 mask 255.255.255.192 

11111111.11111111.11111111.11000000 (subnet mask) 
11000000.10101000.00100001.01001000 (ip address) 

las partes en negrita son los bits de host (el resto son bits de red). Si a su vez todos los bits de host a 0 en el IP, se obtiene la primera IP posibles:

11000000.10101000.00100001.01000000 (192.168.33.64) 

si a su vez todos los bits de host a 1 de, a continuación, se obtiene la última IP posibles (también conocido como la dirección de difusión) :

11000000.10101000.00100001.01111111 (192.168.33.127) 

Así que para mi ejemplo:

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

golpéame también +1 :) – Andrew

+0

Esa es la mejor explicación de cómo calcular esos rangos que leí hasta ahora. Gracias :-) – Anheledir

+0

¿cómo se puede saber/24/25 o/26? ¿Qué es? –

5

máscara Invert (XOR con unos), y con IP. Agregar 1. Este será el rango de inicio. O IP con máscara. Este será el rango final.

23

voy a enviar el código:

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

No todos los sistemas son poco endian. Debes probar 'BitConverter.IsLittleEndian' para determinar si deberías usar' Reverse() '. – JamieSee

+3

Sugeriría utilizar mask = IPAddress.NetworkToHostOrder (máscara) en su lugar. – sunside

1

Puede que ya sepas esto, pero para comprobar que estás recibiendo esto correctamente, echa un vistazo a http://www.subnet-calculator.com/ - puedes ver cómo los bits representan la red y las partes de host de la dirección.

8

Me enteré de que este acceso directo no funciona en la posición de despliegue de la red. Me ayudó mucho, pensé que compartiría este secreto con todos. Hasta ahora, no he podido encontrar una forma más fácil en línea que yo sepa.

Por ejemplo, una red 192.115.103.64/27, ¿cuál es el rango?

sólo recuerda que la máscara de subred es de 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

desde/27 sabemos que (11111111.11111111.11111111.11100000). Contando desde la izquierda, es el tercer número del último octeto, que equivale a 255.255.255.224 máscara de subred. (No cuente 0, 0 es/24), de modo 128, 192, 224..etc

Aquí, donde las matemáticas entra en juego:

usar la máscara de subred - máscara de subred de la máscara de subred anterior cotizada en este caso 224-192 = 32

sabemos 192.115.103.64 es la red: 64 + 32 = 96 (la siguiente red para/27)

que significa que tenemos 0,0 0,32. 64. 96. 128. 160. 192. 224. (No se puede usar 256, ya que es 0.255)

Aquí es la gama 64 - 96.

red es 64.

primera host es 65. (primera red 1)

última anfitrión es 94. (emisión -1)

emisión es 95. (última red -1)

3

recomendaría el uso de ipNetwork Biblioteca https://github.com/lduchosal/ipnetwork. A partir de la versión 2, también es compatible con IPv4 e 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); 

salida

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 

Que se diviertan!

1

de entrada: 192.168.0.1/25

La máscara es esta parte: /25

Para encontrar la dirección de red haga lo siguiente:

  • reste la máscara de la longitud ip (32 - máscara) = 32 - 25 = 7 y tomar esos bits de la derecha

  • En la dirección IP dada Es decir: 192.168.0.1 en binario es: 11111111 11111111 00000000 00000001 Ahora, teniendo 7 bits de derecha '0' 1111111 11111111 00000000 00000000 Qué en decimal es: 192.168.0.0 (esta es la dirección de red)

encontrar primero válida/dirección IP utilizable añadir 1 a la red IE de dirección: 192.168.0.1

para encontrar la última dirección/transmitido el procedimiento es el mismo que el de la búsqueda de direcciones de red, pero aquí hay que hacer (32-bits de máscara) de derecha a ' 1 '

Es decir: ¿Qué 11111111 11111111 00000000 01111111 en decimal es 192.168.0.127

para encontrar la última válida IP/utilizable dirección de restar 1 a la dirección de difusión Es decir: 192.168.0.126

Cuestiones relacionadas