2012-09-11 6 views
4

je liste suivante IP (au format CIDR) stocké dans un fichier TXT: <Comment déterminer si mon internet IP appartient à une liste IP donnée en utilisant Qt

58.200.0.0/13 
202.115.0.0/16 
121.48.0.0/15 
219.224.128.0/18 
... 

Mais je ne sais pas comment peut Je détermine si mon IP appartient à cette liste. J'utilise le framework Qt C++ sur la plate-forme Windows.

+1

[Qu'avez-vous essayé] (http://whathaveyoutried.com/)? Décomposez votre problème en étapes simples et remplissez-les un par un. –

Répondre

8

Vous devez d'abord diviser chaque plage de notation CIDR en une partie réseau (l'adresse IP pointée) et un nombre de bits. Utilisez ce nombre de bits pour générer le masque. , Il vous suffit ensuite de tester si (range & mask) == (your_ip & mask), tout comme votre système d'exploitation ne:

Une partie du code-C psuedo:

my_ip = inet_addr(my_ip_str)   // Convert your IP string to uint32 
range = inet_addr(CIDR.split('/')[0]) // Convert IP part of CIDR to uint32 

num_bits = atoi(CIDR.split('/')[1])  // Convert bits part of CIDR to int 
mask = (1 << num_bits) - 1    // Calc mask 

if (my_ip & mask) == (range & mask) 
    // in range. 

Vous pouvez probablement trouver une bibliothèque pour vous aider. Boost semble avoir un IP4 class qui a < et > opérateurs. Mais vous aurez toujours besoin de travailler avec la notation CIDR.

Ref:

+0

merci beaucoup! Je vais essayer – Richard

5

Les réponses précédentes ont déjà couvert la conversion du texte à la classe d'adresse IP. Vous pouvez vérifier la plage en utilisant QHostAddress::isInSubnet(). Cela retourne vrai lorsque votre adresse IP est dans l'adresse et le masque fourni.

Par exemple, voici un exemple qui vérifie si une adresse IP est zeroconfig (169.254.1.0 à 169.254.254.255):

bool IsZeroconfig(const QHostAddress &ipAddress) 
{ 
    QPair<QHostAddress, int> rangeZeroconfig = QHostAddress::parseSubnet("169.254.0.0/16"); 

    if (ipAddress.isInSubnet(rangeZeroconfig)) 
    { 
     QPair<QHostAddress, int> preZeroconfig = QHostAddress::parseSubnet("169.254.1.0/24"); 
     QPair<QHostAddress, int> postZeroconfig = QHostAddress::parseSubnet("169.254.255.0/24"); 

     if ((!ipAddress.isInSubnet(preZeroconfig)) && (!ipAddress.isInSubnet(postZeroconfig))) 
     { 
      return true; 
     } 
    } 

    return false; 
} 
+0

merci beaucoup. Je l'ai juste trouvé dans la documentation. – Richard

+0

+1 Ah, je ne savais pas que QT avait quelque chose comme ça. Plus simple que ma réponse :-) –

6

Marcher dans la documentation Qt, je suis tombé sur QHostAddress :: parseSubnet (const QString &), qui peut prendre une plage d'adresses IP de type CIDR et est nouveau dans Qt 4.5. Ainsi, je pourrais écrire le code suivant pour le résoudre: (en supposant myIP est de type QHostAddress)

if(myIP.isInSubnet(QHostAddress::parseSubnet("219.224.128.0/18")) { 
    //then the IP belongs to the CIDR IP range 219.224.128.0/18 
} 

Comme pour une meilleure compréhension et un aperçu du problème, la réponse de @Jonathon Reinhart est vraiment utile.

+0

+1 Bon travail à trouver. J'utiliserais certainement la fonctionnalité intégrée là où elle existe (et fonctionne). Mais je suis content de pouvoir vous donner un aperçu. –

Questions connexes