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++Builder Discussion :

Probléme fonction GetLocalIP()


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut Probléme fonction GetLocalIP()
    Bonjour amis développeurs,

    Voici mon problème depuis un certains temps je n'arrive plus à faire fonctionner correctement la fonction GetLocalIP() issue de la FAQ. Le problème vient du dernier if que je n'arrive pas à passer :

    Le code source complet :
    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
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    AnsiString TForm1::getLocalIP()
    {
    	WORD wVersionRequested;
    	WSADATA wsaData;
    	char name[255];
    	AnsiString ip = "Aucune ip trouvée.";
    	PHOSTENT hostinfo;
    	wVersionRequested = MAKEWORD( 2, 0 );
    	if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
    	{
    		if ( gethostname ( name, sizeof(name)) == 0) // nom de l'ordinateur
    		{
    			if((hostinfo = gethostbyname(name)) != NULL)
    			{
    				// récupération de l'ip
    				ip = inet_ntoa (*(in_addr *)*hostinfo->h_addr_list);
    			}
    		}
    		WSACleanup( );
    	  }
    	return ip;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      AnsiString ip1 = getLocalIP();
      ShowMessage(ip1);
    }
    //---------------------------------------------------------------------------
    La partie qui me pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if((hostinfo = gethostbyname(name)) != NULL)
    {
         // récupération de l'ip
         ip = inet_ntoa (*(in_addr *)*hostinfo->h_addr_list);
    }
    Dans mon Unit.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <winsock2.h>
    Merci d'avance.


    [EDIT :] Testé sur un OS virtuel, l'application marche correctement... Quelqu'un aurait-il une idée maintenant que je sais que mon programme n'est pas fautif ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Version C++ Builder ?
    Version OS Virtuel ? XP ?
    Version OS "Fautif" ? Vista ? Seven ? 64 Bits ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    - Embarcadero® C++Builder® 2010
    - XP pro SP3 32 Bits pour les deux OS.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Normalement, il n'y a pas de version UniCode pour gethostname et gethostbyname, n'hésite à l'afficher par un ShowMessage si le débuggueur se montre capricieux !

    Pour la Version de WinSock, perso, j'ai le même code en Delphi, qui fonctionne sous XP SP3 (ma version détecte les IP multiples), et j'utilise la version 1.1 et non 2.0

    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    inet_ntoa renvoie NULL ? Que dit GetLastError() dans ce cas ??

    Que vaut hostinfo->h_addrtype ?

    Et question subsidiaire, que vaut AnsiString( (char*)(hostinfo->h_addr_list[0]) ) ?

    Regardes la description de la structure hostent. h_addr_list contient une liste d'adresses. Si tu as plusieurs interfaces réseaux, il faut parcourir la liste, pas juste prendre la 1ère entrée.

    PS: Ça fait un peu bizarre de répondre à une question par d'autres questions, mais bon...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Par défaut
    gethostname => renvoit 0.

    inet_ntoa renvoie NULL ? Oui.

    GetLastError() => 1101. => WSAHOST_NOT_FOUND, No such host is known.

    hostinfo->h_addrtype => 416.

    Donc un problème d'hôtes méconnu.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    gethostname => renvoit 0.
    heureusement, puis que c'est le test suivant qui ne fonctionne pas !
    Que contient name ?

    Dans la MSDN gethostname
    Citation Envoyé par Note
    If no local host name has been configured, gethostname must succeed and return a token host name that gethostbyname or WSAAsyncGetHostByName can resolve.
    Tu est peut-être dans ce cas ! Même si je n'arrive pas bien à comprendre comment le nom local pourrait ne pas être renseigner pour un ordinateur en réseau ! Car je suppose que tu as un réseau local dont ton poste fait parti, LAN partagé par la machine virtuelle
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Problème : Fonctions et commande Execute
    Par bubi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/11/2005, 11h01
  2. Problème fonction SDL
    Par seeme dans le forum SDL
    Réponses: 2
    Dernier message: 06/11/2005, 20h22
  3. Problème fonction PL/SQL
    Par SSJ17Vegeta dans le forum PL/SQL
    Réponses: 2
    Dernier message: 29/10/2005, 21h14
  4. Problème fonction et trigger sous 7.2
    Par anoukhan dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/06/2005, 22h53
  5. Réponses: 2
    Dernier message: 20/08/2004, 17h10

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