Определение своего IP адреса
|
Из воспоминай системного администратора.
"Все что я помню об этой девушке, это ее IP-адрес..."
|
function my_ip_address: longint;
const
bufsize = 255;
var
buf: pointer;
RemoteHost: PHostEnt; (* Не освобождайте это! *)
begin
buf := nil;
try
getmem(buf, bufsize);
winsock.gethostname(buf, bufsize); (* это может работать и без сети *)
RemoteHost := Winsock.GetHostByName(buf);
if RemoteHost = nil then
my_ip_address := winsock.htonl($07000001) (* 127.0.0.1 *)
else
my_ip_address := longint(pointer(RemoteHost^.h_addr_list^)^);
finally
if buf <> nil then
freemem(buf, bufsize);
end;
result := winsock.ntohl(result);
end;
|
Вначале возвращается локальный сетевой адрес компьютера, а затем, если он не
равен 127.0.0.1, стандартный IP адрес.
Единственное, что вам необходимо, это наличие winsock.dcu/winsock.pas, так
как это не включается в поставку Delphi 1.; необходимый мне код я взял из tcpip
component pack (просто вырезал его оттуда).
Дополнение от Eugene:
Данный пример не работает из-за того что не проинициализирована
структура TWSAData. если немного подправить эту функцию, то получится
примерно следующее:
function my_ip_address: longint;
const
bufsize = 255;
WSVer = $101;
var
buf: pointer;
RemoteHost: PHostEnt; // Не освобождайте это!
wsaData: TWSAData;
begin
if WSAStartup(WSVer, wsaData) <> 0 then
begin
my_ip_address := 0;
exit;
end;
buf := nil;
try
getmem(buf, bufsize);
winsock.gethostname(buf, bufsize); // это может работать и без сети
RemoteHost := Winsock.GetHostByName(buf);
if RemoteHost = nil then
my_ip_address := winsock.htonl($07000001) // 127.0.0.1
else
my_ip_address := longint(pointer(RemoteHost^.h_addr_list^)^);
finally
if buf <> nil then
freemem(buf, bufsize);
end;
result := winsock.ntohl(result);
end;
Функция вернет ненулевое значение в случае успеха.
Тестировано под WinXP SP1, D6
|