IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Problème de calcul d'ip


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut Problème de calcul d'ip
    Bonjour à vous tous.
    J'ai un programme qui reçois en ligne de commande une adresseip, un numéro de réseau et le nombre max de sous réseau. ex: 192.168.2.1, 1024, 2048. Ce que je dois faire est de calculer la plage de sous réseau à partir de cette adresse ip. Ex: 192.168.x.1 à 192.168.x.30 Mais en plus, je dois prendre en considération les sous réseaux disponible à partir du numéro de réseau reçus(1024 dans exemple.) J'ai réussis à tout mettre en binaire, mais le problème est que je ne sais pas comment faire pour soustraire, l'adresseip(binaire) du masque du réseau(binaire aussi). Alors, c'est à partir de là que j'ai besoin de votre aide.
    Merci en avance de votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Points : 402
    Points
    402
    Par défaut
    Bonjour,
    Peux tu être un peu plus clair pour exposer ton problème, en un seul bloc c'est pas facile à lire.
    Ensuite, qu'entends tu par:
    soustraire, l'adresseip(binaire) du masque du réseau(binaire aussi).
    Pour vérifier si une adresse ip correspond à un masque, c'est un & logique entre l'adresse et le masque converti en binaire.
    A bientôt

  3. #3
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Avant tout, merci Wakan de ton aide ^^. Alors je reçois une adresse ip en paramètre. Dans mon cas: 152.23.0.0 Ensuite je le transforme en binaire pour m'aider dans mon calcul.

    Ce qui me donne: 10011000 00010111 00000000 00000000.

    Pour le masque maintenant, j'ai /27 puisque le nombre max de sous réseau doit être égale à 2048.

    Mais si je transforme le masque en binaire, sa me donne: 11111111 11111111 11111111 11100000 00000000.

    Ensuite, grace à ces informations, je dois trouver la plage de sous réseau de 152.23.x.1 à 152.23.x.30 par exemple, mais mon problème vient de là. Je sais pas comment faire pour arrivé à trouver cette plage.

    Et aussi je dois faire le tout en c++ et encore là, j'ai quelque peu de difficulté. Je sais pas si c'est un peu plus clair, mais si jamais ce ne l'était pas, je vais tenter de te l'expliquer une nouvelle fois ^^.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Un ET entre ton adresse et le masque, suivi d'une simple addition ne répond pas à ton problème ? Sinon, je ne l'ai peut être pas compris...

  5. #5
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Oui le Et j'y avais pensé, mais il m'aurait fallu fait au moins deux boucles pour arrivé au résultat finale. Je suis sur qu'il existe une fonction de une des bibliothèques, mais le défis est de la trouver ^^

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Pourquoi 2 boucles ?

  7. #7
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Car la première double servira à faire le calcul, mais ensuite, il va falloir refaire le même calcul mais avec le masque inversé, non?? exemple masque 1: 11111111 11111111 11111111 00000000 et masque 2: 00000000 00000000 00000000 11111111. Pour être capable de trouver l'adresse ip maximum pour le réseau. À moins bien sur que je me goure complètement ^^

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Je peux me tromper. Mais, le masque te donne le minimum ensuite une addition de ce minimum avec ton second paramètre te donne la max ?

  9. #9
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Tu as peut être raison, car j'ai beaucoup de difficulté à bien comprendre tout ce calcul d'adresse. Je vais essayer ça et je te reviens la dessus.

    p.s: le Et c'est bien 1-1=0, 1-0=1 en binaire bien sur ??

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Dans ce tuto, au §3.7, tu as une explication sur l'arithmétique des adresses IP
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup ram-0000 pour ton tuto^^ Effectivement, il m'a beaucoup aidé. Mais hélas j'ai un nouveau problème. Après avoir fait le calcul du Et logique, j'obtiens une réponse en binaire que j'ai stocké dans une variable string nommé etLogique. Ensuite, je veux reconstituer l'adresse ip avec le résultat que j'ai obtenus, mais il ne passe jamais dans mon switch case. Je sais pas si c'est ma condition qui cloche, mais j'ai toujours fait cela comme ça auparavant que sa a toujours marché. Merci de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
     
    	string etLogique;
     
    	for(int i= 0; i != 32; ++i)
    		{
    		if(ip[i] == masqueRéseau[i] && ip[i] != '0' && masqueRéseau[i] != '0')
    			etLogique+= '1';
    		else
    			etLogique+= '0';
     
    		if(i == 31)
    			etLogique[31]= '1';
    		}
    	int reconstruction= 0;
     
    	for(int i= 0; i != etLogique.size(); ++i)
    		{
    		if(etLogique[i] == '1')
    			{
    			switch(i+1)
    				{
    				case 1: reconstruction + 128; break;
    				case 2: reconstruction + 64; break;
    				case 3: reconstruction + 32; break;
    				case 4: reconstruction + 16; break;
    				case 5: reconstruction + 8; break;
    				case 6: reconstruction + 4; break;
    				case 7: reconstruction + 2; break;
    				case 8: reconstruction + 1; break;
    				case 9: reconstruction + 128; break;
    				case 10: reconstruction + 64; break;
    				case 11: reconstruction + 32; break;
    				case 12: reconstruction + 16; break;
    				case 13: reconstruction + 8; break;
    				case 14: reconstruction + 4; break;
    				case 15: reconstruction + 2; break;
    				case 16: reconstruction + 1; break;
    				case 17: reconstruction + 128; break;
    				case 18: reconstruction + 64; break;
    				case 19: reconstruction + 32; break;
    				case 20: reconstruction + 16; break;
    				case 21: reconstruction + 8; break;
    				case 22: reconstruction + 4; break;
    				case 23: reconstruction + 2; break;
    				case 24: reconstruction + 1; break;
    				case 25: reconstruction + 128; break;
    				case 26: reconstruction + 64; break;
    				case 27: reconstruction + 32; break;
    				case 28: reconstruction + 16; break;
    				case 29: reconstruction + 8; break;
    				case 30: reconstruction + 4; break;
    				case 31: reconstruction + 2; break;
    				case 32: reconstruction + 1; break;
    				default: ; break;
    				}
    			}
    		}

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je n'ai pas compris ce que tu veux faire mais ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case 1: reconstruction + 128; break;
    et les autres lignes ne fait strictement rien
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  13. #13
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Ce que je veux faire exactement est reconstitué l'adresse ip à partir du nombre binaire que j'ai eu suite à mon Et logique.

    ex: 10011100 01000000 00000000 00000000,

    le remettre sous cette forme: 156.64.0.0.

    Alors, avec ce case, je voulais faire en sorte que lorsqu'il rencontre un 1, il l'additionne au chiffre correspondant.

    Par exemple dans mon exemple, le premier bit est à 1 alors il aurait additionner 128. Ensuite, il aurait continué et lorsqu'il aurait rencontrer le prochain 1, il aurait ajouter 16 au 128 déjà présent.

    Donc, à la fin des 8 premiers bits, le chiffre que ça m'aurait donné aurait été le total de tout les 1 trouver dans la première partie de l'adresse ip. Aussi j'utilise la variable i pour savoir où est le 1 trouvé ce qui permet ensuite d'aller dans le case et de prendre le bon chiffre à additionner. Je sais pas si ça t'aide.

  14. #14
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Une petite simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(ip[i] == masqueRéseau[i] && ip[i] != '0' && masqueRéseau[i] != '0')
    			etLogique+= '1';
    peut être simplifié en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(ip[i] != '0' && masqueRéseau[i] != '0')
    			etLogique+= '1';
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	int reconstruction= 0;
     
    	for(int i= 0; i != etLogique.size(); ++i)
    		{
    		if(etLogique[i] == '1')
    			{
    			switch(i+1)
    				{
    ...
    peut être transformé en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int reconstruction= 0;
    for(int i= 0; i != etLogique.size(); ++i)
    {
       if(etLogique[i] == '1')
       {
          reconstruction |= 1 << i;
       }
    de plus, je pense qu'une adresse IP devrait être représentée par un nombre non signé et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int reconstruction= 0;
    devrait être préféré
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  15. #15
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    J'ai bien fait les modifications ram-0000 et c'est vrai que je me compliquais un peu trop la vie ^^, mais j'aimerais bien savoir exactement ce que fait cette ligne car j'ai de la difficulté à l'interpréter surtout avec |= et le 1 << i :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reconstruction |= 1 << i;
    Merci encore

  16. #16
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reconstruction |= 1 << i;
    c'est la version simplifiée de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reconstruction = reconstruction | 1 << i;
    c'est l'utilisation de l'opérateur de décalage pour obtenir le bit positionné par i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1 << 0 = 1
    1 << 3 = 8 // 1000
    1 << 7 = 128 // 10000000
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  17. #17
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Ok merci infiniment pour ces quelques éclaircissements ^^, mais j'aurais une autre petite question pour toi. Si je veux avoir la plage de sous réseau pour un numéro de réseau spécifique, comment je peux faire ? Exemple j'ai le réseau 1024 et je veux connaitre la plage de sous réseaux disponibles pour ce réseau, ce qui devrait donner comme réponse: 152.23.128.1 à 152.23.128.30 à partir de l'adresse réseau 152.23.0.0? Je sais pas trop comment faire pour que le calcul donne 128 au troisième bits ?? Merci encore de ton aide

  18. #18
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par carlou135 Voir le message
    Exemple j'ai le réseau 1024
    Cela ne veut rien dire.

    Quand on spécifie une adresse, il faut aussi spécifier son masque de réseau. A partir de ces 2 info, on peut déduire l'adresse réseau, l'adresse broadcast et le nombre d'adresses IP disponibles dans le réseau.

    Citation Envoyé par carlou135 Voir le message
    ce qui devrait donner comme réponse: 152.23.128.1 à 152.23.128.30
    Si je prends tes résultats attendus, cela fait une adresse réseau de 152.23.128.0, une adresse de broadcast de 152.23.128.31 et donc une adresse IP de 152.23.128.0 avec un masque réseau de 255.255.255.224. ou encore 152.23.128.0/27 (autre forme d'écriture souvent rencontrée).

    Le réseau 152.23.0.0 est normallement une classe B donc avec un masque par défaut de 255.255.0.0. Cela veut dire que ton administrateur réseau à subnetté le réseau (ce qui est classique).

    Encore une fois, lorsque l'on donne une adresse IP, il faut aussi donner son masque (ou sinon, on applique le masque par défaut) pour faire les calculs que tu veux faire.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Problème de calcule en SQL !
    Par FilipeVV dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/09/2005, 11h45
  2. Problème de calcul matricielle
    Par Clad3 dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 29/06/2005, 21h45
  3. problème de calcul des normales par sommet
    Par captainSeb dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/01/2005, 13h42
  4. [Calendar]Problème de calcul de date
    Par valerie90 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/12/2004, 12h13
  5. Problème de calcul unix_timestamp
    Par petit_stagiaire dans le forum Administration
    Réponses: 2
    Dernier message: 28/04/2004, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo