Delphi World - Определение своего IP адреса
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Определение своего 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

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования