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

Langage Delphi Discussion :

Obtenir son adresse IP locale (D10 Seattle et +)


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 942
    Points
    40 942
    Billets dans le blog
    62
    Par défaut Obtenir son adresse IP locale (D10 Seattle et +)
    Bonjour,

    J'ai eu besoin de retrouver mon adresse locale, comme il s'agissait d'un programme VCL je me suis tout d'abord fié à la FAQ
    Mais, depuis Delphi Seattle (du moins je crois) les composants internet ne sont pas installés par défaut (il est bien entendu possible de les installer http://docwiki.embarcadero.com/RADSt...posants_socket)

    Donc, à moins d'installer des composants (et encore n'y trouve-t-on point TCustomIpClient) le mieux est encore de passer par Indy (installé, lui)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        uses IdStack;
     
        function GetIP : String;
        begin
          TIdStack.IncUsage;
          try
            Result := GStack.LocalAddress;
          finally
            TIdStack.DecUsage;
          end;
        end;
    D'autres manières (sans installer de composants) ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    deux autres versions:
    la première est tirée de la FAQ
    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
    uses winsock, system.net.Socket;
     
    function LocalIP : String;
    type
      TArrayPInAddr = array [0..10] of PInAddr;
      PArrayPInAddr = ^TArrayPInAddr;
    var
      phe      : PHostEnt;
      pptr     : PArrayPInAddr;
      Buffer   : array [0..63] of ansichar;
      i        : integer;
      GInitData: TWSADATA;
    begin
      WSAStartup($101, GInitData);
      result := '';
      GetHostName(Buffer, sizeof(Buffer));
      phe := GetHostByName(Buffer);
      if phe=nil
        then exit;
      pptr := PArrayPInAddr(phe^.h_addr_list);
      i := 0;
      while pptr^[i]<>nil do
      begin
        result := StrPas(inet_ntoa(pptr^[i]^));
        Inc(i);
      end;
      WSACleanup;
    end;
     
    procedure TForm10.Button1Click(Sender: TObject);
    begin
      // 1
      Label1.Caption := LocalIP;
     
      // 2
      with TSocket.Create(TSocketType.TCP, nil) do
      try
        Caption := LocalIP;
      finally
        Free;
      end;
    end;
    Cordialement,

    @+

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    attention, le PC peux très bien avoir plusieurs adresses IP

    extrait de mon code qui utilise sa propre définition de l'API Winsock, tu peux donc avoir quelques problèmes de types, il peut manquer des @ ou des transtypages...mais le principe est là

    pour ByteString tu peux prendre AnsiString


    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
     
    type
      TAddrList = TArray<Integer>;
     
    function GetLocalAddrList: TAddrList;
      var
        name : ByteString;
        host : PHostEnt;
        addr : PAddr;
        count: Integer;
      begin
        Result := nil;
     
        SetLength(name.Bytes, 50);
        if gethostname(name, 50) = SOCKET_ERROR then
          Exit;
     
        host := gethostbyname(name);
        if host = nil then
          Exit;
     
        addr := host.h_addr_list;
        count := 0;
        while addr^ <> nil do
        begin
          Inc(count);
          Inc(addr);
        end;
        if Count = 0 then
          Exit;
     
        SetLength(Result, count);
        addr := host.h_addr_list;
        count := 0;
        repeat
          Result[count] := addr^^;
          Inc(count);
          Inc(addr);
        until addr^ = nil;
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 942
    Points
    40 942
    Billets dans le blog
    62
    Par défaut
    je vois mon erreur j'ai voulu utiliser uniquement le premier code de la FAQ, l'avertissement
    Ce code ne fonctionne que pour Delphi 6 et supérieur.
    m'a mis dedans
    Je pense qu'il va falloir le changer en
    Ce code ne fonctionne que pour les versions de Delphi 6 à Delphi 10
    Merci à vous 2

    Citation Envoyé par Paul Toth
    attention, le PC peux très bien avoir plusieurs adresses IP
    je me contentai du postulat "une seule carte branchée par PC" mais c'est vrai, faut se méfier avec les utilisateurs ...
    J'ai peut-être intérêt à pousser un peu plus mon truc
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    un cas d'adresses multiples courant chez les développeurs se produit avec les machines virtuelles, il y a un adaptateur virtuel en plus
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 942
    Points
    40 942
    Billets dans le blog
    62
    Par défaut
    Effectivement c'est le cas chez moi
    Citation Envoyé par Configuration IP de Windows
    Carte Ethernet Ethernet :

    Statut du média. . . . . . . . . . . . : Média déconnecté
    Suffixe DNS propre à la connexion. . . : home

    Carte Ethernet VirtualBox Host-Only Network :

    Suffixe DNS propre à la connexion. . . :
    Adresse IPv6 de liaison locale. . . . .: fe80::4897:312d:e715:6b7a%16
    Adresse IPv4. . . . . . . . . . . . . .: 192.168.56.1
    Masque de sous-réseau. . . .*. . . . . : 255.255.255.0
    Passerelle par défaut. . . .*. . . . . :

    Carte réseau sans fil Connexion au réseau local* 1*:

    Statut du média. . . . . . . . . . . . : Média déconnecté
    Suffixe DNS propre à la connexion. . . :

    Carte réseau sans fil Connexion au réseau local* 12*:

    Statut du média. . . . . . . . . . . . : Média déconnecté
    Suffixe DNS propre à la connexion. . . :

    Carte réseau sans fil Wi-Fi*:

    Suffixe DNS propre à la connexion. . . : home
    Adresse IPv6 de liaison locale. . . . .: fe80::e99e:64c:f277:d8%20
    Adresse IPv4. . . . . . . . . . . . . .: 192.168.1.30
    Masque de sous-réseau. . . .*. . . . . : 255.255.255.0
    Passerelle par défaut. . . .*. . . . . : 192.168.1.1
    Du coup je me retrouve avec 192.168.56.1 Il va me falloir procéder à des ajustements
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 401
    Points : 294
    Points
    294
    Par défaut
    Bonjour ,
    j'allais poser la même question,(merci Sergio) .
    j'ai trouvé ce post sur notre forum :
    obtenir adresse ip local

    avez trouvez une mise a jour pour la solution proposée sur la faq?

    Nom : men_ani.gif
Affichages : 442
Taille : 2,4 Ko

  8. #8
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 401
    Points : 294
    Points
    294
    Par défaut
    la solution proposé par Cirec marche très bien .

  9. #9
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    attention, le PC peux très bien avoir plusieurs adresses IP

    extrait de mon code qui utilise sa propre définition de l'API Winsock, tu peux donc avoir quelques problèmes de types, il peut manquer des @ ou des transtypages...mais le principe est là

    pour ByteString tu peux prendre AnsiString


    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
     
    type
      TAddrList = TArray<Integer>;
     
    function GetLocalAddrList: TAddrList;
      var
        name : ByteString;
        host : PHostEnt;
        addr : PAddr;
        count: Integer;
      begin
        Result := nil;
     
        SetLength(name.Bytes, 50);
        if gethostname(name, 50) = SOCKET_ERROR then
          Exit;
     
        host := gethostbyname(name);
        if host = nil then
          Exit;
     
        addr := host.h_addr_list;
        count := 0;
        while addr^ <> nil do
        begin
          Inc(count);
          Inc(addr);
        end;
        if Count = 0 then
          Exit;
     
        SetLength(Result, count);
        addr := host.h_addr_list;
        count := 0;
        repeat
          Result[count] := addr^^;
          Inc(count);
          Inc(addr);
        until addr^ = nil;
      end;
    end;
    comme je n'arrivais pas à afficher une IP correcte avec ton code (j'obtenais que 192)
    j'ai réécris ton code à ma sauce et là j'obtiens bien toutes les 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
    function GetLocalAddrList: TArray<string>;
    var
      Name: AnsiString;
      Host: PHostEnt;
      Addr: PMarshaledAString;
      Count, i: integer;
    begin
      Result := nil;
     
      SetLength(Name, 50);
      if GetHostName(PAnsiChar(Name), 50) = SOCKET_ERROR then
        exit;
     
      Host := GetHostByName(PAnsiChar(Name));
      if Host = nil then
        Exit;
     
      Addr := Host^.h_addr ;
      Count := 0;
      while Addr^ <> nil do
      begin
        Inc(Count);
        Inc(Addr);
      end;
      if Count = 0 then
        Exit;
     
      SetLength(Result, Count);
      for i := 0 to Count - 1 do
      begin
        Result[i] := AnsiString(Format('%d.%d.%d.%d', [ord(Host^.h_addr^[0]),
          ord(Host^.h_addr^[1]), ord(Host^.h_addr^[2]), ord(Host^.h_addr^[3])]));
        Inc(Host^.h_addr);
      end;
    end;
     
    procedure TForm10.Button2Click(Sender: TObject);
    var
      SArr: TArray<string>; 
      S: string;
    begin
      SArr := GetLocalAddrList;
      for S in SArr do
        Memo1.Lines.Add(S);
    end;
    la question est pourquoi ça n'a pas fonctionné avec ton code ?
    je ne sais pas où j'ai "merdé"

    Cordialement,

    @+

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Cirec Voir le message
    la question est pourquoi ça n'a pas fonctionné avec ton code ?
    je ne sais pas où j'ai "merdé"
    tu n'as pas merdé, c'est juste que dans mon unité je déclare directement l'API Winsock avec des types adaptés à l'usage que j'en fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      PAddr = ^PInteger;
      THostEnt = record
        h_name     : PAnsiChar;          // official name of host
        h_aliases  : ^PAnsiChar;         // alias list
        h_addrtype : Smallint;           // host address type
        h_length   : Smallint;             // length of address
        h_addr_list: PAddr;
      end;
      PHostEnt = ^THostEnt;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. [À télécharger] Obtenir son adresse IP
    Par pottiez dans le forum Téléchargez
    Réponses: 3
    Dernier message: 17/12/2014, 11h36
  2. Comment trouver son adresse IP locale ?
    Par theclem35 dans le forum Débuter
    Réponses: 5
    Dernier message: 07/06/2011, 18h55
  3. Obtenir son adresse IP locale
    Par thegitch dans le forum C#
    Réponses: 3
    Dernier message: 10/12/2009, 16h32
  4. Réponses: 3
    Dernier message: 30/10/2008, 14h30
  5. obtenir son adresse mac
    Par MonsieurAk dans le forum Windows
    Réponses: 6
    Dernier message: 24/08/2005, 11h01

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