2009-06-22 14 views
3

Je souhaite effectuer un ensemble de tâches réseau sur une plage d'adresses IP. Dès que la portée est plus grande qu'un réseau de classe c, je ne parviens pas à énumérer tous les hôtes de la gamme. Je veux être en mesure de parcourir tous les hôtes d'un réseau avec le masque de réseau 255.255.240.0.Comment puis-je faire défiler une plage d'adresses IP?

 
From: 192.168.0.100 
To: 192.168.10.100 

Comment pourrait-on aborder cette question? Ce doit être une tâche assez commune. Je viens des champs verts de la programmation iPhone Cocoa, donc une solution C-élégante serait appréciée. :-)

+4

Suis-je en train de lire la question? Il n'y a actuellement aucune adresse entre 192.158.0.255 et 192.168.1.0. Peut-être que vous avez besoin de modifier pour le rendre plus clair. – alxp

+0

alxp: vous supposez que la carte d'adresse IP normale est utilisée. Au moins sur mon routeur domestique, je ne suis pas au courant de quoi que ce soit m'empêchant d'exécuter le LAN sur 123.234.123. #, Malgré que ce soit une utilisation complètement incorrecte de la plage d'adressage disponible – Sukasa

+0

merci. J'édite ma question. La gamme était en effet absurde – Monobono

Répondre

1

Utilisez l'opérateur de module %. Voici un exemple primitif:

#include <stdio.h> 

int main(void) { 
    int counter; 
    unsigned int ip[] = { 192, 168, 0, 0 }; 

    for (counter = 0; counter < 1000; ++counter) { 
     ip[3] = (++ ip[3] % 256); 
     if (!ip[3]) { 
      ip[2] = (++ ip[2] % 256); 
     } 
     printf("%u:%u:%u:%u\n", ip[0], ip[1], ip[2], ip[3]); 
    } 

    return 0; 
} 
1

Voici une solution PHP:

<?php 

$sIP1 = '192.168.0.0'; 
$sIP2 = '192.168.1.255'; 

$aIPList = array(); 
if ((ip2long($sIP1) !== -1) && (ip2long($sIP2) !== -1)) // As of PHP5, -1 => False 
{ 
for ($lIP = ip2long($sIP1) ; $lIP <= ip2long($sIP2) ; $lIP++) 
    { 
    $aIPList[] = long2ip($lIP); 
    } 
} 
?> 

Il y a un bon résumé des (de base) les mathématiques impliqués here

7

Ceci est un morceau de code qui va rapidement vous présenter les nuances dans l'interprétation de l'adresse IP et itérer à travers elle. Les choses deviennent assez simples une fois que vous commencez à regarder une adresse IP comme un entier non signé de 32 bits.

#include <stdio.h> 
int 
main (int argc, char *argv[]) 
{ 
    unsigned int iterator; 
    int ipStart[]={192,168,0,100}; 
    int ipEnd[] = {192,168,10,100}; 

    unsigned int startIP= (
     ipStart[0] << 24 | 
     ipStart[1] << 16 | 
     ipStart[2] << 8 | 
     ipStart[3]); 
    unsigned int endIP= (
     ipEnd[0] << 24 | 
     ipEnd[1] << 16 | 
     ipEnd[2] << 8 | 
     ipEnd[3]); 

    for (iterator=startIP; iterator < endIP; iterator++) 
    { 
     printf (" %d.%d.%d.%d\n", 
      (iterator & 0xFF000000)>>24, 
      (iterator & 0x00FF0000)>>16, 
      (iterator & 0x0000FF00)>>8, 
      (iterator & 0x000000FF) 
     ); 
    } 

    return 0; 
} 

Il suffit de vérifier qu'aucun des éléments pour ipStart et ipEnd sont supérieurs à 255.
Ce ne sera pas une adresse IP et il gâchera le code aussi.

Questions connexes