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

Web & réseau Delphi Discussion :

IP locale en fonction du Hostname


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut IP locale en fonction du Hostname
    Bonjour,

    Après plusieurs recherches sur le web, je finis par poster ici, mon problème étant que je n'arrive pas à trouver l'ip locale d'un ordinateur sur mon réseau local à partir du Hostname, voici donc mon code (qui ne marche pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ListBox1.ItemIndex > 1 then
    Begin
    // On mets le message a envoyé sous cette forme : Hostnameenfonctiondel'ip + a dit : + Le message entré dans le Memo2.
    messend := (Gstack.HostByAddress(Gstack.LocalAddress) + ' dit : ' + Memo2.Text);
    // On envoie à la personne sélectionnée dans la ListBox.
    ip := Gstack.LocalAddress(ListBox1.Items[ListBox1.ItemIndex]); // Ligne à problème.
    IdUDPCLient1.Send(ip, 3000, messend);
    End;
    Je recherche donc un équivalent à Gstack.LocalAddress() pour les hostnames vus que mes items dans ma ListBox comportent des Hostnames.

    Je suis donc en attente de votre réponse.

    Cordialement,

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par défaut
    as-tu essayé les basiques GetHostByAddr et GetHostByName de WinSock.pas ?
    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 habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Alors, voici ce que l'IDE me dit à la compilation :

    Pour : GetHostByAddr(ListBox1.Items[ListBox1.ItemIndex]);

    - Incompatible types : 'Pointer' and 'String'.

    Et pour : GetHostByName(ListBox1.Items[ListBox1.ItemIndex]);

    - Incompatible 'string' and 'PAnsiChar'.

    Après la seconde erreur, j'ai essayé ceci :

    GetHostByName(PAnsiChar(ListBox1.Items[ListBox1.ItemIndex]));

    Et j'ai eus cette erreur :

    - Incompatible 'string' and 'PHostEnt'.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par défaut
    Tu as regardé l'aide du SDK de l'API Windows et de WinSock2 ?
    Tu utilisais des Fonctions Wrappers encapsulant les API Windows qui utilisent des paramètres du C
    tu connais la touche :F1: ?
    Un peu d'effort !

    J'ai déjà utilisé ces fonctions, voici du vieux codes que j'avais trouvé à l'époque, je suis de bonne humeur, je te la donne !

    pour Appeler, le code suivant suffit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetStringListLocalIP(Memo1.Lines);
    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
     
    function GetStringListLocalIP(IPList : TStrings): Integer;
    type
        TArrayInAddr = array [0..15] of PInAddr;
        PArrayInAddr = ^TArrayInAddr; // Pointeur sur un Tableau de type TArrayInAddr
    var
        lpHostEntry : PHostEnt; // Pointeur sur un THostEnt
        lpaInAddr : PArrayInAddr; // Pointeur
        Buffer : array [0..63] of char;
        i : Integer;
        lpWSAData : TWSADATA;
    begin
        Result := 0;
        if not Assigned(IPList) then begin
           Exit;
        end;
     
        // Version 1,1
        // lpWSAData est un paramètre en sortie que je n'utilise pas
        WSAStartup(MAKEWORD( 1, 1 ), lpWSAData);
        // Récupération du nom de l'Hôte dans buffer
        GetHostName(Buffer, SizeOf(Buffer));
        // Récupération du pointeur sur le la Struture THostEnt corrsespondant à l'Hôte
        lpHostEntry :=GetHostByName(buffer);
        if lpHostEntry = nil then Exit;
        // Transtypage de la liste d'adresse IP format numérique en Tableau de type TArrayInAddr
        // h_addr_list de PHostEnt est une liste d'adresse IP
        // PArrayInAddr(...) effectue le transtypage
        lpaInAddr := PArrayInAddr(lpHostEntry^.h_addr_list);
        i := 0;
        // pptr est un pointeur donc pptr^ est le contenu
        while lpaInAddr^[i] <> nil do begin
        //Conversion en chaine Pascal de l'adresse IP en Format '.' à partir du format numérique
        // lpaInAddr^[i] est un pointeur donc lpaInAddr^[i]^ est le contenu
            IPList.Add( StrPas(inet_ntoa(lpaInAddr^[i]^)) );
            Result:= Result + 1 ;
            Inc(i);
        end;
        // C'est la dernière la bonne
        // Libération du Socket
        WSACleanup;
    end;

    Tu peux transformer cette fonction GetStringListLocalIP en GetStringListIP(HostName, IPList), suffit de mettre la paramètre HostName dans Buffer et de ne plus appeler GetHostName
    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 habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    La fonction ne marche pas dans mon cas vus qu'à la base, les hostnames dans les items de ma ListBox sont considérées comme 'Strings'.

    Bref je mets quand même résolu, je ne suis pas du genre à demander de l'aide, apparament quand on en demande, cela dérange, du moins c'est cette impression que j'ai.

    Bonne continuation.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par défaut
    Non, c'est surtout que tu ne lis même pas l'aide lorsque l'on t'indique deux nouvelles fonctions que tu ne connais pas, tu déballes des erreurs de compilateur qui sont évidentes puisque ces fonctions utilisent des paramètres différents !
    Tu n'as pas les reflexes minimales !

    Ensuite, je t'ai indiqué comment transformer la fonction en ceci, ou l'on passe le HostName en paramètre, tu avais 2 lignes de code à modifier mais tu n'en fait même pas l'effort !

    Tient du code prêt à l'emploi !

    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
    function GetStringListIP(const HostName: string; IPList : TStrings): Integer;
    type
        TArrayInAddr = array [0..15] of PInAddr;
        PArrayInAddr = ^TArrayInAddr; // Pointeur sur un Tableau de type TArrayInAddr
    var
        lpHostEntry : PHostEnt; // Pointeur sur un THostEnt
        lpaInAddr : PArrayInAddr; // Pointeur
     
        i : Integer;
        lpWSAData : TWSADATA;
    begin
        Result := 0;
        if not Assigned(IPList) then begin
           Exit;
        end;
     
        // Version 1,1
        // lpWSAData est un paramètre en sortie que je n'utilise pas
        WSAStartup(MAKEWORD( 1, 1 ), lpWSAData);
     
        // Récupération du pointeur sur le la Struture THostEnt corrsespondant à l'Hôte
        lpHostEntry :=GetHostByName(PChar(HostName));
        if lpHostEntry = nil then Exit;
        // Transtypage de la liste d'adresse IP format numérique en Tableau de type TArrayInAddr
        // h_addr_list de PHostEnt est une liste d'adresse IP
        // PArrayInAddr(...) effectue le transtypage
        lpaInAddr := PArrayInAddr(lpHostEntry^.h_addr_list);
        i := 0;
        // pptr est un pointeur donc pptr^ est le contenu
        while lpaInAddr^[i] <> nil do begin
        //Conversion en chaine Pascal de l'adresse IP en Format '.' à partir du format numérique
        // lpaInAddr^[i] est un pointeur donc lpaInAddr^[i]^ est le contenu
            IPList.Add( StrPas(inet_ntoa(lpaInAddr^[i]^)) );
            Result:= Result + 1 ;
            Inc(i);
        end;
        // C'est la dernière la bonne
        // Libération du Socket
        WSACleanup;
    end;

    Sinon, euh Gstack.LocalAddress c'est une propriété et non une fonction, ton code à la base, il ne compile même pas ?

    As tu regardé la fonction WSGetHostByName du GStack !
    Idem, en 2 clics sur l'aide Indy, j'ai trouvé la réponse !
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OpenMP] variable locales et fonctions récursives
    Par Babcool dans le forum Programmation parallèle, calcul scientifique et de haute performance (HPC)
    Réponses: 0
    Dernier message: 14/09/2010, 14h58
  2. Réutilisation de variable Locale dans fonction differente
    Par Luke spywoker dans le forum Général Python
    Réponses: 4
    Dernier message: 09/07/2010, 09h13
  3. Variable locale à une fonction.
    Par MoiRemi dans le forum PL/SQL
    Réponses: 7
    Dernier message: 04/02/2009, 17h05
  4. [NASM] Variables locales à une fonction
    Par Rémiz dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 13/11/2008, 10h33
  5. Définition locale de fonction : temps nécessaire?
    Par Fractal LLG dans le forum Caml
    Réponses: 5
    Dernier message: 05/04/2008, 00h04

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