2011-09-26 8 views
5

Tengo una IP como esta: 12.12.12.12
Estoy recorriendo diferentes rangos de IP (en 12.12.12.0/24 (ejemplo)) formato, y tratando de ver si la IP está en el rango.
He intentado varios métodos como inet_addr y comparar pero parece que no puedo obtenerlo.
¿Hay una manera fácil de hacer esto? Estoy usando Windows.IP cae en el rango CIDR

+0

relacionadas: http://stackoverflow.com/questions/1507579/how- can-i-determine-that-user-ip-address-is-in-accessible-range-or-not –

+0

Eso es PHP, como se puede ver en las etiquetas que estoy usando C++ – seth

Respuesta

6

Sólo probar si:

(ip & netmask) == (range & netmask) 

se puede determinar la máscara de red de la CIDR parámetros range/netbits de la siguiente manera:

uint32_t netmask = ~(~uint32_t(0) >> netbits); 
+1

podría ser necesaria una conversión 'ntohl' antes de hacer esto. – KillianDS

+0

@KillianDS: asumo que el proceso de análisis produce una dirección en orden de bytes local, pero tiene razón, es algo que debe verificarse, especialmente porque 'inet_addr' devuelve el orden de bytes de la red. –

+0

¿Ves algo mal aquí? Parece imprimir para cada uno: 'int cidr = atoi (cdrbuf); \t \t unsigned long ulstart = ntohl (inet_addr (clip)); \t \t unsigned long ulcheck = ntohl (inet_addr ("12.12.12.12")); \t \t unsigned long netmask = ~ unsigned long (~ 0ULL >> cidr); \t \t if ((ulcheck y máscara de red) == (CIDR y máscara de red)) \t \t \t printf ("% s \ n", PCH); ' – seth

2

Tome la representación binaria y ponga a cero lo que no coincide con su máscara de red.

Aclaración: Digamos que usted tiene la IP a.b.c.d y desea hacerlo coincidir con e.f.g.h/i a continuación, se puede tirar de la IP en uno entero sin signo, uint32_t ip = a<<24 + b<<16 + c<<8 + d y hacer lo mismo con uint32_t range = e<<24 + f<<16 + g<<8 + h. Ahora puede usar su máscara de red: uint32_t mask = (~0u) << (32-i). Ahora, simplemente puede verificar si ip "está en" range comparándolos: ip & mask == range & mask.

+0

La iteración evidentemente proviene de la prueba en contra de un todo el lío de rangos. –

+0

@Ben Voigt: Debo haberme perdido eso. Tienes razón. – bitmask

Cuestiones relacionadas