Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2761 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Algorithme débutant C++ adressage IP

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Algorithme débutant C++ adressage IP

n°2170503
sonicsyndi​cate42
Posté le 09-01-2013 à 19:59:07  profilanswer
 

Bonjours, je suis étudiant en première STI 2D spécialisation informatique/réseau et électronique.
Je suis ici pour une demande d'aide assez urgente...
Voila, mon sujet c'est de rendre un programme en mode console qui quand l'utilisateur entre une IP le programme donne :
         - La classe de l'IP (sa j'ai réussi)
         - Il traduira l'adresse en binaire pour l'étape suivante (je ne réussi pas sans être en programme GUI, avec la console j'y arrive pas pour le binaire..)
         - Il donnera le masque de sous réseau de l'IP (non réussi)
         
Voila, merci bien, je vous mets le code pour la première étape que j'ai écris, vraiment très simple, mais surrement mal écris, je préfère le GUI :P .. :
 
 
(je cherche aussi à placer une boucle qui fera rerentrer à l'utilisateur une IP cette fois valide, mais je ne sais pas où la placer dans mon code)
 
 
[cpp]#include <string>
#include <iostream>
using namespace std;
 
int main(int argc, const char * argv[])
{
    int ipUser; // IP entrée par l'USER
   
         
    cout << " Entrez une adresse IP" << endl;
    cin >> ipUser;
     
 
    if ( ipUser >= 0 && ipUser <= 127)   // Définition classe A
    {
        cout << " classe A " << endl ;
    }
     
    else if ( ipUser >= 128 && ipUser <= 191) // Définition classe B
    {
        cout << " classe B " << endl;
    }
     
    else if ( ipUser >= 192 && ipUser <= 223) // Définition classe C
    {
        cout << " classe C " << endl;
    }
     
    else if ( ipUser >= 224 && ipUser <= 239) // Définition classe D
    {
        cout << " classe D " << endl;
    }
     
    else if ( ipUser >= 240 && ipUser <= 255) // Définition classe E
    {
        cout << " classe E " << endl;
    }
     
     
    else
        cout << " Entrez une adresse IP entre 0 et 223" ; // Si pas A,B,C = message d'erreur
   
 
        return 0;
} [cpp]


Message édité par sonicsyndicate42 le 09-01-2013 à 20:17:47

---------------
Etudiant première STI 2D série informatique/éléctronique
mood
Publicité
Posté le 09-01-2013 à 19:59:07  profilanswer
 

n°2170613
breizhbugs
Posté le 10-01-2013 à 16:49:34  profilanswer
 

Une adresse ip a 4 champ entre 0 et 255.
Toi tu ne prends en compte que le premier champ....
 
bref, tu dois lire un nombre, un point, un nombre, un point, un nombre, un point, un nombre.
Pas juste un nombre!


---------------
Seul Google le sait...
n°2170636
sonicsyndi​cate42
Posté le 10-01-2013 à 19:44:13  profilanswer
 

Sauf que pour afficher la classe dans ce programme je n'ai besoin que des trois premiers chiffre

n°2170644
breizhbugs
Posté le 10-01-2013 à 20:38:05  profilanswer
 

Super ton raisonnement...
Et pour la suite?


Message édité par breizhbugs le 10-01-2013 à 20:38:19

---------------
Seul Google le sait...
n°2170663
Terminapor
I'll see you rise.
Posté le 10-01-2013 à 22:47:36  profilanswer
 

Tu peux pas classer une IP sur un seul Byte, hein :D  
 
Stock ton addresse IP sur un int, découpe-le pour l'affichage (Tu affiches octet par octet , en décimal), idem pour la lecture (L'utilisateur doit enter x.x.x.x, à toi de traduire ça comme il faut).
Pour la traduction en binaire, il suffit de jouer avec les opérateurs & (opérateur logique '&' bit à bit), et <</>> (décalage à gauche, décalage à droite.)
 
Par exemple, tu as un int k :  
k&0b1000 : Tu récupère le 4ème bit.


---------------
Perhaps you don't deserve to breathe
n°2170687
Riokmij
Blink and you're dead
Posté le 11-01-2013 à 10:21:41  profilanswer
 

Je suis le seul à être choqué de voir ça
 

Citation :

je suis étudiant en première STI 2D spécialisation informatique/réseau


 
suivi d'un exercice basé sur les classes de réseau, qui est une notion obsolète depuis bientôt 20 ans ? Et je ne parle même pas d'IPv6...


Message édité par Riokmij le 11-01-2013 à 10:22:40

---------------
Are you two fucking? Are you serious? Right in front of my salad?!
n°2170833
sonicsyndi​cate42
Posté le 12-01-2013 à 13:41:46  profilanswer
 

Riokmij, c'est mon année de première, je commence juste le programme..

n°2170849
Riokmij
Blink and you're dead
Posté le 12-01-2013 à 16:06:48  profilanswer
 

sonicsyndicate42 a écrit :

Riokmij, c'est mon année de première, je commence juste le programme..


 
C'est pas le problème...
 
Perso, ça me choque de voir que dans une formation info/réseau, on te donne des exos basés sur des choses qui n'existe plus. Ça donne l'impression que l'exercice à été écrit il y a vingt ans et que personne ne s'est préoccupé de le mettre à jour.  
 
C'est un peu comme si en comptabilité, on te filait des exercices avec des montants en anciens francs. Ça ne rend pas forcément l'exercice invalide ou moins pertinent, mais ça montre un certain "jmenfoutisme" de la part de celui qui donne le cours.  
 
Enfin bref, apparemment je suis le seul à qui ça pose problème...  [:spamafote]


---------------
Are you two fucking? Are you serious? Right in front of my salad?!
n°2170875
gilou
Modérateur
Modzilla
Posté le 12-01-2013 à 20:40:45  profilanswer
 

J'aurais essayé un truc dans ce style ci:

Code :
  1. #include <boost/regex.hpp>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <sstream>
  5. #include <string>
  6. #include <bitset>
  7. using namespace std;
  8. int main ()
  9. {
  10.     // d'abord, on lit les données utilisateur
  11.     string user_input;
  12.     cin.exceptions(istream::failbit | istream::badbit);
  13.     try {
  14.         cout << "Veuillez taper l'adresse IPv4." << endl;
  15.         getline(cin, user_input);
  16.     } catch(istream::failure e) {
  17.         cout << "Erreur a la lecture des donnees!" << endl;
  18.         return -1;
  19.     }
  20.     // On verifie que c'est bien quelque chose de la forme voulue
  21.     string const ipv4_pattern = "^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$";
  22.     if ( boost::regex_match(user_input.begin(), user_input.end(), boost::regex(ipv4_pattern)) == false ) {
  23.         cout << "Ce n'est pas une adresse IP!" << endl;
  24.         return -1;
  25.     }
  26.     int ipv4[4] = {0, 0, 0, 0};
  27.     // on remplace les . par des blancs pour l'opérateur >>
  28.     replace(user_input.begin(), user_input.end(), '.', ' ');
  29.     // et on lit comme une suite de 4 chiffres
  30.     istringstream iss(user_input);
  31.     for (unsigned i = 0; i != 4; ++i) {
  32.         iss >> ipv4[i];
  33.         if (ipv4[i] > 255) {
  34.             cout << "Ce n'est pas une adresse IP!" << endl;
  35.             // cout << (i+1) <<"e-partie de l'adresse IP trop grande!" << endl;
  36.             return -1;
  37.         }
  38.     }
  39.     // et tu fais ce que tu as a faire avec ipv4 a partir d'ici.
  40.     // ici j'imprime avec la valeur binaire
  41.     for (unsigned i = 0; i != 4; ++i) {
  42.         cout << bitset<8>(ipv4[i]);
  43.         if (i == 3) {
  44.             cout << endl;
  45.         } else {
  46.             cout << ".";
  47.         }
  48.     }
  49.     return 0;
  50. }


On récupère l'input utilisateur, et on la valide avec une expression régulière simple. J'utilise celle de la librairie boost, car celle de g++ est inexistante et inutilisable.
Si ton compilo a une implémentation correcte de C++11 (ça doit marcher avec celui de Microsoft par exemple), on peut utiliser la librairie standard, en transformant le source comme:
#include <boost/regex.hpp> -> #include <regex>
et if ( boost::regex_match(user_input.begin(), user_input.end(), boost::regex(ipv4_pattern)) == false ) {  ->  
if ( regex_match(user_input.begin(), user_input.end(), regex(ipv4_pattern, regex_constants::ECMAScript)) == false ) {  
Si l'expression régulière a matché l'input utilisateur, on remplace les . par des blancs pour lire avec >> comme une suite de 4 nombres, qu'on range dans un tableau après avoir vérifiés qu'ils ne dépassent pas 255.
 
A+,


Message édité par gilou le 12-01-2013 à 20:47:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Algorithme débutant C++ adressage IP

 

Sujets relatifs
Ajax : problème (niveau Iut/Bts)[C]Problème d'écriture avec fopen/fprintf et énumération bancale
Modification d'un site PHP, problème affichage page (débutant)Comment récuperer les IP visiteurs
Retransmettre Flux Vidéo Caméra Ip sur Site HTMLProxy cache en C
Explication algorithmeBibliothèque C accès WEB
[C/Reseau] proxy FTP (simple) en C 
Plus de sujets relatifs à : Algorithme débutant C++ adressage IP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR