Mon objectif (D7) : être sûr que le poste est connecté sur le même réseau que le poste hébergeant la Base de Données ! L'adresse de ce dernier étant (bien entendu) connue .
Voilà comment je m'en sors , cependant il me reste 2 questions ainsi qu'une remarque
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
|
unit IPUnit;
interface
uses IdStack;
function isDBinLAN(DBIP : String): Boolean;
function GetIp : String;
implementation
function isDBinLAN(DBIP : String): boolean;
var LDBIp,LmyIP,Mask : LongInt;
myIP : String;
begin
with TIdStack.CreateStack do
begin
myIP:=LocalAddress;
TranslateStringToTInAddr(ResolveHost('255.255.255.0'),mask);
TranslateStringToTInAddr(ResolveHost(DBIP),LDBip);
TranslateStringToTInAddr(myIP,LmyIP);
Result:=((LDBIP AND mask)=(LmyIP AND Mask)) OR (ResolveHost(DBIP)=ResolveHost('localhost'));
Free;
end;
end;
function GetIP : String;
begin
with TIdStack.CreateStack do
begin
Result := LocalAddress;
Free;
end;
end;
end. |
Questions :
-la variable Mask , masque de sous-réseau j'ai bien sur utilisé le plus 'classique' mais est-ce une bonne idée ? je ne suis pas une pointure en IP est-ce que cela fonctionnerai si j'ai 2 sous-réseau ? il doit y avoir un moyen plus élégant que d'utiliser une constante '255.255.255.0' via formule mathématique que j'entrevoie , mais je sèche un peu .
-C'est bien beau pour IPv4 mais que se passe t'il si IPv6 ?
Remarque :
Pour faire cette unité , j'ai pas mal cogité , lu les FAQs etc... ce qui m'amène à la FAQ Comment connaître son adresse IP ? le code pour les Delphi<D6 n'est pas faux mais renvoi uniquement la dernière adresse réseau (donc pas forcément celle recherchée)
1 2 3 4 5 6
| i := 0;
while pptr^[i]<>nil do
begin
result := StrPas(inet_ntoa(pptr^[i]^));
Inc(i);
end; |
l'adresse IP d'un poste étant généralement la première
result := StrPas(inet_ntoa(pptr^[0]^));
aurait peut être été plus juste ? ou me trompe_je (tel l'éléphant) ?
Partager