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
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.