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. #1
    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 Trouver le pays d'une personne en fonction de son IP
    Bonjour,
    Je suis actuelement en train de chercher un moyen de trouver le pays d'une personne en fonction de son IP, comme dans le Virtual Trace de McAfee.
    J'ai appris qu'il était possible de faire ca en PHP. Voici le lien :Tuto
    J'ai donc essayé de reproduir la l'opération PHP en C++, en utilisant les protocoles HTTP. Je n'ai pas réussi, et de toute façon cette méthode ne me plaisait pas. Cependant, j'ai téléchargé la base de données de IP-to-Country. Le fichier se présente donc sous la forme d'un fichier .txt de 732 ko...
    Ma question est donc : y-a-t'il un moyen d'utiliser cette base de données dans mon programme C++ ?

  2. #2
    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 me permet de poster mon code de requete HTTP :
    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
    #include <winsock2.h>
    #include <stdio.h>
     
    #pragma comment(lib,"ws2_32.lib")
     
    #define BUFSIZE 1024
     
    int connexion(char* server_name,int port)
    {
    	int sock;
    	struct sockaddr_in serverSockAddr;
    	struct hostent *serverHostEnt;
    	memset(&serverSockAddr,0,sizeof(serverSockAddr));
    	serverHostEnt = gethostbyname(server_name);  // recupere données sur serveur.
    	if (serverHostEnt == NULL)
    	{
    		printf("Serveur introuvable : %s\n",server_name);
    		return -1;
    	}
    	memcpy(&serverSockAddr.sin_addr,serverHostEnt->h_addr,serverHostEnt->h_length);
    	serverSockAddr.sin_port = htons(port);
    	serverSockAddr.sin_family = AF_INET;
     
    	sock = socket(AF_INET,SOCK_STREAM,0); // cree la socket
    	if (sock<0)
    	{
    		printf("creation de socket a foire...\n");
    		return -1;
    	}
    	if(connect(sock,(struct sockaddr *)&serverSockAddr,sizeof(serverSockAddr))<0)
    	{
    		printf("Impossible de se connecter :(\n");
    		return -1;
    	}
    	return sock;
    }
     
    void request(int sock,char* host,char* get)
    {
        char commande[500];
    	char buf[BUFSIZE];
    	int lu;
    	FILE* F;
        sprintf(commande,"GET %s HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\n\r\n",get,host);
        send(sock,commande,strlen(commande)+1,0);
     
    	F=fopen("IP.html","wb");
    	do
    	{
    		lu=recv(sock,&(buf[0]),BUFSIZE,0);
    		fwrite(&(buf[0]),lu,1,F);
    	} while(lu>0);
    	fclose(F);
    }
     
    int main()
    {
    	int sock=-1;
    	char server_name[]="ip-to-country.com";
    	char request_host[]="ip-to-country.com";
    	char request_path[]="/get-country/?ip='1042284544'&user=guest&pass=guest";
     
    	int port=80;
     
    	WSADATA wsa;
    	WSAStartup(MAKEWORD(2,0),&wsa);	
     
    	sock=connexion(server_name,port);
    	if (sock<0)
    		return -1;
     
    	request(sock,request_host,request_path);
     
    	/* fermeture de la connection */
    	shutdown(sock,2);
    	closesocket(sock);
    	WSACleanup( );
    	return 0;
    }
    Le fichier IP.html généré m'affcihe:
    HTTP/1.1 302 Found Date: Mon, 26 Jun 2006 15:26:22 GMT Server: Apache/1.3.33 (Unix) mod_jk/1.2.1-beta-1 mod_gzip/1.3.26.1a Midgard/1.5.0/SG PHP/4.4.2 Location: http://ip-to-country.webhosting.info/get-country/?ip='1042284544'&user=guest&pass=guest Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1 161
    Found
    The document has moved here.


    --------------------------------------------------------------------------------

    Apache/1.3.33 Server at www.ip-to-country.com Port 80
    0

  3. #3
    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
    Regarde du côté d'ip2countries qui est un fichier contenant une association IP <=> pays.

  4. #4
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    Je ne suis pas sûr d'avoir compris le problème.. Quel est-il ?

  5. #5
    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
    Le probleme est que mon code d'envoit de requetes HTTP ne fonctionne pas, et que je préfererai de toute facon utiliser une autre méthode. J'ai donc pensé à utiliser la base de donnée de IP-to-Country, associant des IPs à des pays. Mais les bases de données ne sont utilisables que pour les scripts en PHP. Je voulais savoir si il y avait un moyen d'utiliser quand même cette base de donnée.
    Citation Envoyé par Miles
    Regarde du côté d'ip2countries qui est un fichier contenant une association IP <=> pays.
    Mais sous quelle forme ce fichier se présente-t'il ? C'est une base de données ?
    J'ai regardé le fichier RIR.idx de McAfee. Voila ce que j'y ai trouvé :
    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
    [apnic]
    24.192.0.0	24.195.255.255
    60.0.0.0	61.255.255.255
    169.208.0.0	169.223.255.255
    202.0.0.0	203.255.255.255
    210.0.0.0	211.255.255.255
    218.0.0.0	222.255.255.255
     
    [ripe]
    24.132.0.0	24.135.255.255
    62.0.0.0	62.255.255.255
    80.0.0.0	82.255.255.255
    139.20.0.0	139.29.255.255
    141.0.0.0	141.85.255.255
    145.224.0.0	145.254.255.255
    146.48.0.0	146.48.255.255
    149.202.0.0	149.204.255.255
    149.206.0.0	149.251.255.255
    150.254.0.0	150.254.255.255
    151.0.0.0	151.100.255.255
    160.44.0.0	160.63.255.255
    160.216.0.0	160.220.255.255
    163.156.0.0	163.175.255.255
    164.0.0.0	164.40.255.255
    164.128.0.0	164.143.255.255
    171.16.0.0	171.33.255.255
    188.0.0.0	188.255.255.255
    192.71.0.0	192.71.255.255
    192.106.0.0	192.106.255.255
    192.114.0.0	192.118.255.255
    192.162.0.0	192.162.255.255
    192.164.0.0	192.167.255.255
    193.0.0.0	195.255.255.255
    198.17.117.0	198.17.117.255
    212.0.0.0	213.255.255.255
    217.0.0.0	217.255.255.255
     
    [lacnic]
    200.0.0.0	201.255.255.255
    Dites moi...Ca ne ressemble pas à des adresses IP ca ?

  6. #6
    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
    Ben si, ce sont des plages d'adresses IP.

  7. #7
    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 oui, mais j'en fais quoi ?

  8. #8
    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
    Ben là, il te manque encore les pays, tu n'as juste pas pris le bon fichier.

  9. #9
    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
    C'était le seul lisible, les autre sont compilés et donc totalement incompréhensibles. Je crois qu'il existe des outils pour décompiler des programmes mais je doute fortement de la légalité de leur utilisation...
    Sinon tu parlais de "ip2countries". J'ai fais une recherche mais je n'en ai pas tiré grand chose. C'est quoi concretement ?

  10. #10
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    A priori, c'est ce que tu cherches...
    Regardes-là : http://ip-to-country.webhosting.info/node/view/6

  11. #11
    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
    Mais ca ne me sert à rien une base de donnée SQL pour PHP ! Je ne sais pas comment l'utiliser !Regarde ca :
    Database
    C'est la base de données de IP-to-Country. C'est un énorme fichier texte bordélique, une suite de 732 ko de charactere !!! Bon j'ai quand même trouvé un moyen d'organiser tout ca
    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
    #include <cstdlib>
    #include <iostream>
    #define TAILLE_MAX 9999
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        FILE* fichier = NULL;
        FILE* virtual_trace = NULL;
        char chaine[TAILLE_MAX] = "";
     
        fichier = fopen("optimized-IP-to-Country-2003-03-01.txt", "r");
        virtual_trace = fopen("virtual_trace.txt", "w");
     
        if (fichier != NULL)
        {
            while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                printf("%s", chaine); // On affiche la chaîne qu'on vient de lire
                fprintf(virtual_trace, "%s", chaine);
            }
     
            fclose(fichier);
            fclose(virtual_trace);
        }
     
        system("PAUSE");
        return 0;
    }
    Ca ca range tout bien proprement dans un autre fichier texte.
    Au lieu d'avoir le bazar de tout à l'heure on a :
    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"
    C'est quand même mieu ! Et ca ressemble plus au schéma du tuto :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IP_FROM IP_TO COUNTRY_CODE COUNTRY_NAME 
    1042284544 1042292735 CH SWITZERLAND 
    1042292736 1042317311 UK UNITED KINGDOM 
    1042317312 1042350079 PL POLAND 
    1042350080 1042415615 RU RUSSIAN FEDERATION 
    1042415616 1042546687 FR FRANCE 
    1042546688 1042677759 ES SPAIN 
    1042677760 1042743295 GR GREECE 
    1042743296 1042808831 FR FRANCE 
    1042808832 1042817023 DE GERMANY 
    1042817024 1042825215 IE IRELAND 
    1042825216 1042833407 CZ CZECH REPUBLIC
    Le probleme c'est que je comprends toujours pas comment on peut s'en servir...
    Pourquoi on a deux adresses codées ?! Une aurait pas suffit ? Pourquoi "From" et "To" ? Je veux juste, à partir d'une adresse IP, en trouver l'origine !

  12. #12
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Ah, j'avais pas compris ton problème à partir du fichier d'origine...

    Ce que tu as dans chaque enregistrement, ce sont des plages d'adresses IP. SI je reprend la première ligne, on sait qu'une adresse comprise entre 1042284544 et 1042292735 est suisse... Soit après conversion : une adresse IP entre 62.218.250.94 et 62.219.27.125 est suisse.

    Pour la conversion, voir par exemple http://ip-to-country.webhosting.info/node/view/55

  13. #13
    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
    Oui, je vien de comprendre !!! ^^
    J'ai déjà fait une petie fonction de formatage de l'adresse IP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int formatIP(int a, int b, int c, int d)
    {
        int ip;
        a *= (256*256*256);
        b *= (256*256);
        c *=  256;
     
        ip = a + b + c + d;
        return ip;
    }
    Maintenant on peut penser à des trucs genre "if("ip > 1042284544 && ip < 1042292735)" pour déduir qu'on est suisse, mais... Il faudrait faire ca manuelement ! Ca me prendra des siècles !

  14. #14
    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
    Ce sont des PLAGES d'adresses !

  15. #15
    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
    Et alors ? Il faut bien comparer l'IP transformée avec les valeurs de la BDD ! Il suffit de faire une bête condition comme je l'ai montré. D'après moi la vrai problème, c'est l'extraction des données. Sinon ce taper toutes les condition possibles, non merci !
    Mais je ne comprends pas comment on peut extraire et stocker des centaines de valeurs !

  16. #16
    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
    Prends un bout de papier et réfléchis à une manière plus élégante de faire ce que tu veux faire.

  17. #17
    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 excuse moi, mais j'ai pas vraiment d'idée... toi tu en as une ?
    Tu pourrais pas me donner un petit coup de main ? S'il te plaît !

  18. #18
    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
    Malheureusement, j'ai d'autres choses à faire...

  19. #19
    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
    Juste une piste ! Une idée ! Je ne te demande pas de faire le travail à ma place !

  20. #20
    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 commences par te créer une structure dans laquelle tu vas stocker les plages et les pays qui vont bien. Par exemple une map. Pour la fonction de comparaison, tu dis que pour 2 clés c1 et c2, la condition c1 < c2 retourne true si la borne sup de c1 est inférieure à la borne inf de c2, et ceci de manière stricte.
    Ensuite, pour récupérer un élément qui correspond à une adresse ip quelconque, tu fais une paire avec 2 fois la même adresse IP, et tu cherches la borne inf dans la map, et cette borne inf a de bonnes chances d'être ton résultat.
    Maintenant, c'est une idée en 30sec, c'est pas forcément le mieux, mais tu peux voir si ça marche, ou plutôt comment ça pourrait marcher sur papier et ensuite améliorer la structure utilisée.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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