Conversion de l’adresse IP en entier

Dupliquer possible:
Adresse IP à Integer – C

Comment convertir une adresse IP en entier qui se présente sous la forme suivante: AB . ou ABC * ou A .. . * ou . . . Je veux écrire un programme C qui peut déterminer si une adresse IP est un sous-ensemble d’une autre. Par exemple, l’adresse IP 192.168.125.5 est un sous-ensemble de 192.168. . . Maintenant, je veux convertir les adresses IP en entiers uniques et vérifier ensuite si l’une est un sous-ensemble de l’autre. Y a-t-il un moyen d’y parvenir?

Une adresse IP, par exemple 192.168.0.1, peut facilement être écrite sous forme d’entier en l’écrivant au format hexadécimal, qui devient 0xC0 0xA8 0x00 0x01 ou 0xC0A80001.

Ensuite, il ne s’agit que d’une correspondance de bits. Vous construisez donc un masque de sous-réseau correspondant, 255.255.0.0, qui n’est autre que 0xFFFF0000, et vous pouvez vérifier que les deux correspondent, en procédant comme suit:

 0xC0A80001 & 0xFFFF0000 == 0xC0A80000 & 0xFFFF0000 

où l’un des côtés du test d’égalité est la “firebase database qui vous tient à coeur” et l’autre est une adresse réelle, un masque donné étant identique des deux côtés.

En général, vous pouvez construire un masque approprié en définissant les éléments qui sont ‘*’ sur 0 et les éléments qui sont des nombres sur 0xFF. Si vous voulez des masques à grain plus fin, il est difficile de les exprimer avec ‘*’.

Ce que vous voulez, c’est déterminer si une adresse IP est dans un sous-réseau, et pour ce faire, vous voulez appliquer un masque de réseau. Il y a probablement (certainement) des bibliothèques déjà disponibles pour faire ce que vous voulez. Ceci est si vous voulez rouler le vôtre.

Si cette adresse IP provient d’une source approuvée (c’est-à-dire, pas d’un utilisateur), vous pouvez simplement extraire l’adresse IP d’une chaîne C standard en procédant comme suit:

 char ipAddressSsortingng[16] = "192.168.125.5" char netMaskSsortingng[16] = "255.255.0.0" char subnetSsortingng[16] = "192.168.0.0" uint32_t ipAddress = parseIPV4ssortingng(ipAddressSsortingng); uint32_t netmask = parseIPV4ssortingng(netmaskSsortingng); uint32_t subnet = parseIPV4ssortingng(subnetSsortingng); if (ipAddress & netmask == subnet) { return true; } uint32_t parseIPV4ssortingng(char* ipAddress) { char ipbytes[4]; sscanf(ipAddress, "%uhh.%uhh.%uhh.%uhh", &ipbytes[3], &ipbytes[2], &ipbytes[1], &ipbytes[0]); return ipbytes[0] | ipbytes[1] << 8 | ipbytes[2] << 16 | ipbytes[3] << 24; } 

La méthode simple et non générale consiste à utiliser sscanf (avec a, b, c, d): sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d); Mais cela ne fonctionne que si vous avez ip avec toutes les sections: 10.47.100.1

Si ce n’est pas le cas, vous pouvez toujours utiliser la valeur renvoyée de sscanf , qui vous indiquera le nombre de correspondances qu’il a réussi à trouver (ou EOF).

Après avoir passé les 4 chiffres, vous pouvez vérifier la relation entre les sous-ensembles.

Un seul entier (en supposant 32 bits) ne suffit pas pour représenter ce que vous décrivez. Vous avez besoin de plus d’informations pour pouvoir exprimer les astérisques.

Par exemple, vous pouvez avoir une paire de (adresse, masque de réseau), le masque de réseau étant soit un simple petit entier représentant le nombre de bits de poids fort valides, de sorte que, par exemple, une adresse réseau telle que “10.0.0.0” puisse être représenté par la paire (0x0a000000, 8). Si vous voulez vraiment pouvoir utiliser des caractères génériques “n’importe où” dans l’adresse pour une raison quelconque, vous avez besoin d’un ensemble complet d’un bit de drapeau par bit d’adresse, soit deux entiers de 32 bits. Ensuite, vous pouvez représenter quelque chose comme “192.168..” En tant que paire (0xc0a80000, 0xffff0000).