Get ip avec indy

Description

Utilise Indy pour obtenir l'IP de son site, même au travers d'un routeur.
Le site checkip.dyndns.org est consulté. Les autres sites provoquent des déconnexions.

Source / Exemple :


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,IdTCPClient,IdException, ComCtrls,StrUtils;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    procedure IdClientSocket1Connect(Sender: TObject);
    //procedure IdClientDisconnected (Sender: TObject);
  end;

var
  Form1: TForm1;
  IdTCPClient1: TIdTCPClient;
const CRLF= chr(13)+Chr(10);

implementation

{$R *.dfm}
//function getip:string; stdcall; external 'get_public_ip';

procedure TForm1.Button1Click(Sender: TObject);
begin
//programmation du port de communication
  IdTCPClient1:= TIdTCPClient.Create(self);
  IdTCPClient1.Host:= 'checkip.dyndns.org';
  //IdTCPClient1.Host:= 'www.adresseip.com';
  IdTCPClient1.Port:= 80;
  IdTCPClient1.ConnectTimeout:= 10000;
  IdTCPClient1.OnConnected:= IdClientSocket1Connect;
  IdTCPClient1.ReadTimeout:=5000;
  try
    IdTCPClient1.Connect;
  except
  on E: EIdException do
    begin
      If E.message = 'Socket Error # 11004'#$D#$A then
      Showmessage('Pas de connexion internet');
    end;

  end;
end;

procedure TForm1.IdClientSocket1Connect(Sender: TObject);
//la connexion a eu lieu: on lit la page retournée
VAR
Str1: string;
P: integer;
begin
  IdTCPClient1.Socket.WriteLn('GET /HTTP/1.1');
  IdTCPClient1.Socket.WriteLn('');
  Str1:= IdTCPClient1.Socket.ReadLn(CRLF);
  if Str1='HTTP/1.1 204 NO RESPONSE' then
  Begin
    Showmessage('Le serveur ne répond pas: il y a une erreur.');
   exit;
  End;
  if length(Str1)=0 then   //le timeout a déclenché
  Begin   //le n'a pas répondu dans le temps
    Showmessage( 'Le serveur n''a pas répondu.');
   exit;
  End;
  //lire la réponse jusqu'à ce qu'on trouve ip address.
  repeat
    Str1:= IdTCPClient1.Socket.ReadLn(CRLF);
    P:= pos('current ip address',lowercase(Str1))
  until P>0;
  P:= posex(':',Str1,P)+1;
  Str1:= copy(Str1,P);
  P:=pos('<',Str1)-1;
  Str1:=copy(str1,1,P);
  Edit1.Text:= str1;
  IdTCPClient1.Disconnect;
end;

end.

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.