TIP [DELPHI] – Leggere l’indirizzo IP del computer su cui gira la vs applicazione
E’ possibile ottenere l’ip (ip address) del proprio computer utilizzando la classe Indy “idIpWatch” , ad esempio per inserire l’ip nella caption del ns form è sufficiente:
implementation
uses IdIPWatch;
...
procedure TfrmMain.FormCreate(Sender: TObject);
var
ids: TidIpWatch;
begin
ids := TidIpWatch.Create;
Caption := Caption + '(' + ids.LocalIP + ':8888)';
ids.Free;
end;
Se invece ci si volesse complicare un pochino la vita si potrebbe interrogare direttamente il winSock in modo da non dover includere una classe indy nel progetto ma semplicemente il remap delle socket di windows. Di seguito una funzione che utilizzavo in Delphi 7 … che ovviamente da Delphi 2009 in poi andrebbe rivista dato che le stringhe sono diventate in formato Unicode.
di seguito la funzione che interroga Winsock:
uses winsock;
…
function GetIPFromHost(var HostName, IPaddr, WSAErr: string): Boolean;
type
Name = array[0..100] of Char;
PName = ^Name;
var
HEnt: pHostEnt;
HName: PName;
WSAData: TWSAData;
i: Integer;
begin
Result := False;
if WSAStartup($0101, WSAData) = 0 then
begin
WSAErr := ‘Winsock is not responding.”‘;
Exit;
end;
IPaddr := New(HName);
if GetHostName(HName^, SizeOf(Name)) = 0 then
begin
HostName := StrPas(HName^);
HEnt := GetHostByName(HName^);
for i := 0 to HEnt^.h_length – 1 do
Begin
IPaddr := Concat(IPaddr,IntToStr(Ord(HEnt^.h_addr_list^[i])) + ‘.’);
End;
SetLength(IPaddr, Length(IPaddr) – 1);
Result := True;
end
else
begin
case WSAGetLastError of
WSANOTINITIALISED : WSAErr:=’WSANotInitialised’;
WSAENETDOWN : WSAErr:=’WSAENetDown’;
WSAEINPROGRESS : WSAErr:=’WSAEInProgress’;
end;
end;
Dispose(HName);
WSACleanup;
end;