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 :

Trouver le pays d'une personne en fonction de son IP


Sujet :

C++

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    ...
    Je savais que ca allait être un truc de ce genre (un truc compliqué je veux dire).
    Bon je vais y réfléchir.
    Merci pour ton aide.

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Miles
    Tu commences par te créer une structure dans laquelle tu vas stocker les plages et les pays qui vont bien. Par exemple une map.
    Une map ? Tu veux dire une carte ?

  3. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Non, une map en POO est un tableau associatif.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #24
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    utiliser un
    std::Map

    la clef est un interval
    avec des function de comparaison < > ==
    et la valeur est le pays

    c'est pas tres compliqué quand meme
    en plus c'est du csv (comma separated value)
    super simple a parser, ou meme a importer dans une database.

    T'utilise une database, dans quel cas plus besoin de map

    A+

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Bon bon bon j'ai essayé de faire une petit code schématique. Voila ce que j'ai imaginé :
    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
    59
    60
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int formatIp(char *ip)
    {
        int ipFormated, a, b, c, d;
        // décompose l'IP
        // extrait les 4 valeurs numériques
        // stock les valeurs dans des variables a, b, c et d.
        // code avec des calculs :
        a *= (256*256*256);
        b *= (256*256);
        c *=  256;
     
        ipFormated = a + b + c + d;
        return ipFormated;
    }
     
    string database(int ipFormated, FILE *database)
    {
        int ipFrom, ipTo;
        char countryCode[2], countryName[20];
        char string[9999] = "";
     
        database = fopen("optimized-IP-to-Country-2003-03-01.txt", "r");
     
        if (database != NULL)
        {
            while (fgets(string, TAILLE_MAX, database) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                  // décompose la string
                  // stock les valeurs dans les 4 variables 
                  // ipFrom, ipTo, countryCode et coountryName
                  // comparaison avec l'IP formatée :
     
                  if(ipFormated > ipFrom && ipFormated < ipTo)
                  {
                      return countryName;
                  }
            }
     
            fclose(database);
        }
    }
     
     
    int main(int argc, char *argv[])
    {
        char ip[20];
        cin >> ip; // on enregistre l'IP
     
        FILE *bdd = NULL;
     
        cout << database(formatIp(ip), bdd); //affichage de la nationalité
     
        system("PAUSE");
        return 0;
    }
    Comme vous le voyez il manque des parties que j'ai remplacé par des commentaires. C'est tout simplement parce que je sais pas encore commment le faire. Sinon je voudrais bien votre avis sur ce code. On peut faire mieu ? Il y a des erreurs ? C'est nul ? Génial ? ^^

  6. #26
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    J'ai pas réussi à faire le code avec la fonctions de manipulation de strings en C++, mais j'ai réussi avec les fonctions C.
    Et ca marche pas ! Je sais pas du tout pourquoi. S'il vous plaît vous pouvez m'aider ?
    Voici à quoi ressemble ma base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0,16777215,US,UNITED STATES
    50331648,83886079,US,UNITED STATES
    100663296,385875967,US,UNITED STATES
    Les valeurs sont séparées par des virgules.
    Voici maintenant mon code complet, sensé affichier la nationalité de l'utilisateur après que celui-ci est entré son adresse IP :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #include <cstdlib>
    #include <iostream>
    #define MAX_SIZE 9999
     
    using namespace std;
     
    // Cette fonction retourne l'adresse IP codée
    // compréhensible par la base de données.
    int formatIp(char *ip)
    {
        char* ca; 
        char* cb;
        char* cc;
        char* cd;
        int ipFormated, ia, ib, ic, id;
     
        ca = strtok(ip, ".");
        sscanf(ca, "%d", &ia);
     
        cb = strtok(NULL, ".");
        sscanf(cb, "%d", &ib);
     
        cc = strtok(NULL, ".");
        sscanf(cc, "%d", &ic);
     
        cd = strtok(NULL, ".");
        sscanf(cd, "%d", &id);
     
        ia *= (256*256*256);
        ib *= (256*256);
        ic *=  256;
     
        ipFormated = ia + ib + ic + id;
        return ipFormated;
    }
     
    // Cette fonction ouvre la base de données pour 
    // extraire les strings qu'elle contient. 
    // On effectue ensuite une comparaison avec l'IP codée
    // pour savoir si c'est elle qui correspond, 
    // auquel cas on retourne le nom du pays.
    char* database(int ipFormated, FILE *bdd)
    {
        int   ipFrom, ipTo;
        char* cIpFrom;
        char* cIpTo;
        char* countryCode; 
        char* countryName;
        char  string[MAX_SIZE] = "";
     
        bdd = fopen("database.txt", "r");
     
        if (bdd != NULL)
        {
            while (fgets(string, MAX_SIZE, bdd) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                  cIpFrom = strtok(string, ",");
                  sscanf(cIpFrom, "%d", &ipFrom);
     
                  cIpTo = strtok(string, ",");
                  sscanf(cIpTo, "%d", &ipTo);
     
                  countryCode = strtok(string, ",");
     
                  countryName = strtok(string, ",");
     
                  if(ipFormated > ipFrom && ipFormated < ipTo)
                  {
                      return countryName;
                  }
            }
     
            fclose(bdd);
        }
    }
     
    // Fonction principale.
    int main(int argc, char *argv[])
    {
        char ip[20];
        cout << "Entrez votre adresse IP" << endl;
        cin >> ip; // on enregistre l'IP
     
        FILE *bdd = NULL; // pour la base de données.
     
        cout << "Le pays associe a cette adresse est : " << database(formatIp(ip), bdd) << endl; //affichage de la nationalité
     
        system("PAUSE");
        return 0;
    }
    Voila. Une fois l'adresse rentrée, le prog me dit "Le pays associe a cette adresse est : " et c'est tout.
    J'ai fais quelques tests pour afficher les variables ipFrom, ipTo, countryName... a chaque fois le programme m'affiche 0. Je comprends rien.
    Un peu d'aide siouplaît !

  7. #27
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu as regardé au débuggeur ?

  8. #28
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Ben non, j'ai jamais appris à m'en servir. A quoi ca sert ?
    Sinon tu sais d'où vient le probleme ?

  9. #29
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ca sert à débugger et à répondre à ta question.

  10. #30
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    ha merci ! ^^
    Et concretement, ca sert à quoi le débuggage, à part débugger ?

  11. #31
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    A rien, c'est un débuggeur, ça sert à débugger... A voir l'évolution de son programme au cours de son exécution, quoi.

  12. #32
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Youpiiii ! C'est bon ! Ca marche. C'était une petite erreur de code.
    Merci beaucoup pour votre aide !
    Salut !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/11/2014, 15h24
  2. [Débutant] Trouver l'équation d'une courbe en fonction d'un tableau de valeur
    Par mahmoudbs dans le forum MATLAB
    Réponses: 5
    Dernier message: 04/08/2012, 22h38
  3. [MySQL] Afficher une donnée en fonction de son identifiant
    Par Bibbe dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/11/2007, 16h27
  4. cocher une checkbox en fonction de son nom
    Par boss_gama dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/09/2006, 16h42
  5. Fonction WHOIS : Trouver le pays d'une IP donnée
    Par bigsister dans le forum Réseau
    Réponses: 11
    Dernier message: 18/07/2005, 18h18

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