Ip internet via une connexion réseau - récupérer une ip dans un string

Description

Petite programme simple permettant de connaître son IP Internet, même derrière une connexion réseau.

Il utilise le composant "NMHTTP" fourni avec les versions "Entreprise" et "Pro" de Delphi, dans l'onglet "Internet" pour Delphi 4 Pro, "FastNet" pour Delphi 6 Entreprise, à vérifier sur d'autres versions, s'il existe encore... ou déjà !

Voici le principe.
Il existe des serveurs renvoyant cette IP tant convoitée.
On se connecte à un des serveurs dédiés à ce service.
J'en ai sélectionné 4, placés par ordre de rapidité.
Il reste à exploiter la page retournée, afin d'en extraire l'IP, qui seule nous intéresse.

C'était un excellent prétexte pour essayer ma fonction

GetIPAdress(var IP: String; Txt: String): Boolean;

qui retourne True et renvoie la première IP valide rencontrée dans un String, et False dans le cas contraire.

C'est en principe largement suffisant pour l'utilisation envisagée, sinon le code peut être modifié en conséquence.

L'avantage de cette méthode est de pouvoir interpréter à priori toute page contenant une IP, quelle que soit la langue utilisée ou la mise en page.

Je n'ai pas alourdi le programme pour rendre sa compréhension plus aisée, mais il gagne à être automatisé, un serveur valide pouvant pallier immédiatement à une connexion défaillante... On peut également envisager un fichier .ini ou autre pour stocker une collection d'adresses Url de serveurs, classés par ordre de fiabilité/pérennité/rapidité et chargés automatiquement par le programme.

Quelle est l'utilité de connaître son IP internet par programmation ?
Pourquoi pas dans l'optique d'un programme P2P, entre deux (ou plus) ordis personnels de confiance ?
Il suffirait que le programme envoie l'IP (cryptée de préférence) sur un serveur. Chaque ordi doté du même programme fait de même, récupère les autres IP sur ce même serveur, puis les décrypte, afin de s'interconnecter directement...

Source / Exemple :


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls, Psock, NMHttp;

type
  TForm1 = class(TForm)
    sbInfo: TStatusBar;
    NMHTTP1: TNMHTTP;
    edIP: TEdit;
    Label1: TLabel;
    Button1: TButton;
    cbURL: TComboBox;
    Animate1: TAnimate;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Déclarations privées }
    procedure Connection;
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function GetIPAdress(var IP: String; Txt: String): Boolean;
var   { Récupère la première IP valide trouvée }
  i: Integer;
  Chiffre, Point, Groupe: Integer;
  Tmp: String;

      procedure InitialiseTout;
      begin
        Tmp     := '';
        Chiffre := 0;
        Point   := 0;
        Groupe  := 0;
      end;
      
begin
  Result := False;
  if Txt = '' then Exit;
  InitialiseTout;
  for i := 1 to Length(Txt) do
  begin
    if Txt[i] in ['0'..'9'] then  // chiffre rencontré
    begin
      Inc(Chiffre);
      if Chiffre > 3 then
        InitialiseTout
      else
        Tmp := Tmp + Txt[i];
    end
    else if Txt[i] = '.' then     // point rencontré
    begin
      Inc(Point);
      if (Point > 3) or (Tmp = '') or ((Tmp <> '') and (Tmp[Length(Tmp)] = '.')) then
        InitialiseTout
      else
      begin
        Tmp := Tmp + Txt[i];
        Inc(Groupe);
        Chiffre := 0;
      end;
    end
    else
    begin                         // autre caractère rencontré
      if (Groupe = 3) and (Tmp[Length(Tmp)] in ['0'..'9']) then
        Break     // Résultat trouvé !  -> sortie
      else
      if Tmp <> '' then
      begin
        InitialiseTout;
      end;
    end;
  end;
  IP := Tmp;
  Result := Tmp <> '';
end;

procedure TForm1.Connection;
var
  Url1: String;
  Body: String;
  IP: String;
begin
  edIP.Clear;
  Url1 := cbURL.Text;
  Animate1.Active := True;
  sbInfo.SimpleText := 'Recherche en cours...';
  try
    if NMHTTP1.Connected then NMHTTP1.Disconnect;
    NMHTTP1.Get(Url1);
  except
    NMHTTP1.Disconnect;
    ShowMessage('problème de connexion avec ce serveur');
    Exit;
  end;
  Body := NMHTTP1.Body;
  if GetIPAdress(IP, Body) then
    edIP.Text := IP;
  Animate1.Active := False;
  sbInfo.SimpleText := 'Terminé';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Connection;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  cbURL.ItemIndex := 0;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if NMHTTP1.Connected then NMHTTP1.Disconnect;
end;

end.

Conclusion :


Fait sous Delphi 4 Pro.
Il faut impérativement disposer du composant NMHTTP pour pouvoir compiler.
Sinon, compilable dès D3, sauf erreur.

Une source similaire mais avec une approche différente par Caribensila ici :
http://www.delphifr.com/code.aspx?id=27202

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.