2011-09-26 17 views
5

Ho un IP simile al seguente: 12.12.12.12
Sto eseguendo il looping di diversi intervalli IP (nel formato 12.12.12.0/24 (esempio)) e sto provando a vedere se l'IP è in la gamma.
Ho provato vari metodi come inet_addr e il confronto ma non riesco a ottenerlo.
C'è un modo semplice per farlo? Sto usando Windows.L'IP scende nell'intervallo CIDR

+0

correlati: http://stackoverflow.com/questions/1507579/how- can-i-define-that-user-ip-address-is-in-access-range-or-not –

+0

Questo è PHP, come puoi vedere dai tag sto usando C++ – seth

risposta

6

Basta verificare se:

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

È possibile determinare la maschera di rete dal CIDR parametri range/netbits come segue:

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

una conversione 'ntohl' potrebbe essere necessaria prima di fare questo. – KillianDS

+0

@KillianDS: sto presupponendo che il processo di analisi produca un indirizzo nell'ordine dei byte locale, ma hai ragione, è qualcosa da ricontrollare, specialmente dato che "inet_addr" restituisce l'ordine dei byte di rete. –

+0

Vedete qualcosa di sbagliato qui? Sembra stampare per ogni singolo: '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 netmask lunga non firmata = ~ unsigned long (~ 0ULL >> cidr); \t \t if ((ulcheck e maschera di rete) == (CIDR e maschera di rete)) \t \t \t printf ("% s \ n", PCH); ' – seth

2

Prendere la rappresentazione binaria e azzerare ciò che non corrisponde alla maschera di rete.

Chiarimento: Diciamo che avete la IP a.b.c.d e volete abbinare a e.f.g.h/i allora, si può buttare l'IP in un unico numero intero senza segno, uint32_t ip = a<<24 + b<<16 + c<<8 + d e fare lo stesso con uint32_t range = e<<24 + f<<16 + g<<8 + h. Ora puoi usare la tua maschera di rete: uint32_t mask = (~0u) << (32-i). Ora, puoi semplicemente verificare se è confrontandoli: ip & mask == range & mask.

+0

L'iterazione proviene evidentemente dal test contro un tutto un casino di gamme. –

+0

@Ben Voigt: Devo averlo perso. Hai ragione. – bitmask

Problemi correlati