Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить имя компьютера по IP

Delphi , Интернет и Сети , TCP/IP

Получить имя компьютера по IP

Мой домашний компьютер используется на 300%: на системный блок мы складываем журналы, с клавиатурой и мышкой играется ребенок, а на мониторе сидит плюшевый медведь.


uses 
  WinSock; 

function LocalIP: string; 
type 
  TaPInAddr = array[0..10] of PInAddr; 
  PaPInAddr = ^TaPInAddr; 
var 
  phe: PHostEnt; 
  pptr: PaPInAddr; 
  Buffer: array[0..63] of Char; 
  I: Integer; 
  GInitData: TWSAData; 
begin 
  WSAStartup($101, GInitData); 
  Result := ''; 
  GetHostName(Buffer, SizeOf(Buffer)); 
  phe := GetHostByName(buffer); 
  if phe = nil then Exit; 
  pPtr := PaPInAddr(phe^.h_addr_list); 
  I := 0; 
  while pPtr^[I] <> nil do 
  begin 
    Result := inet_ntoa(pptr^[I]^); 
    Inc(I); 
  end; 
  WSACleanup; 
end; 

function IPAddrToName(IPAddr: string): string; 
var 
  SockAddrIn: TSockAddrIn; 
  HostEnt: PHostEnt; 
  WSAData: TWSAData; 
begin 
  WSAStartup($101, WSAData); 
  SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr)); 
  HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); 
  if HostEnt <> nil then 
    Result := StrPas(Hostent^.h_name) 
  else 
    Result := ''; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  ShowMessage(IPAddrToName(LocalIp)); 
end; 

{**************************************} 

// Function to get the IP Address from a Host 

function GetIPFromHost(const HostName: string): string; 
type 
  TaPInAddr = array[0..10] of PInAddr; 
  PaPInAddr = ^TaPInAddr; 
var 
  phe: PHostEnt; 
  pptr: PaPInAddr; 
  i: Integer; 
  GInitData: TWSAData; 
begin 
  WSAStartup($101, GInitData); 
  Result := ''; 
  phe := GetHostByName(PChar(HostName)); 
  if phe = nil then Exit; 
  pPtr := PaPInAddr(phe^.h_addr_list); 
  i := 0; 
  while pPtr^[i] <> nil do 
  begin 
    Result := inet_ntoa(pptr^[i]^); 
    Inc(i); 
  end; 
  WSACleanup; 
end;

Программный код, предоставленный вами, написан на языке Delphi и использует библиотеку WinSock для взаимодействия с сетью. Он предназначен для извлечения локального имени компьютера из его IP-адреса или наоборот.

Вот некоторые наблюдения и предложения:

  1. Функция LocalIP извлекает локальный IP-адрес компьютера, вызывая функцию GetHostName, а затем парсит возвращенное имя хоста с помощью функции GetHostByName. Это подход не очень эффективен, так как он требует множества системных вызовов для извлечения IP-адреса.
  2. Функция IPAddrToName принимает IP-адрес в качестве входного параметра и возвращает соответствующее имя хоста. Она использует функцию gethostbyaddr для разрешения IP-адреса к имени хоста.
  3. Функция GetIPFromHost принимает имя хоста в качестве входного параметра и возвращает соответствующий IP-адрес(ы). Она использует функцию GetHostByName для извлечения структуры hostent, которая содержит список IP-адресов, связанных с именем хоста.

Чтобы улучшить этот код:

  • Вместо парсинга имени хоста, возвращенного функцией GetHostName, можно использовать функции gethostbyname или getaddrinfo для извлечения IP-адреса напрямую.
  • Можно использовать компонент TIdStack из библиотеки Indy (популярной библиотеки Delphi для сетевого программирования) для упрощения процесса разрешения имен хостов и IP-адресов.

Вот измененный вариант кода:

function LocalIP: string;
begin
  Result := '';
  WSAStartup($101, nil);
  try
    Result := inet_pton(AF_INET, GetHostName(nil), nil);
  finally
    WSACleanup();
  end;
end;

function IPAddrToName(IPAddr: string): string;
var
  SockAddrIn: TSockaddrIn;
  HostEnt: PHostent;
begin
  WSAStartup($101, nil);
  try
    SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
    HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.s_addr, SizeOf(SockAddrIn), AF_INET);
    Result := StrPas(HostEnt^.h_name);
  finally
    WSACleanup();
  end;
end;

function GetIPFromHost(const HostName: string): string;
var
  phe: PHostent;
begin
  WSAStartup($101, nil);
  try
    phe := GetHostByName(PChar(HostName));
    if phe <> nil then
      Result := inet_ntoa(phe^.h_addr_list^)
    else
      Result := '';
  finally
    WSACleanup();
  end;
end;

Обратите внимание, что я удалил переменную GInitData и использовал значение nil вместо нее, так как она не необходима для инициализации WinSock явно. Кроме того, я упростил код, используя блок try-finally, чтобы обеспечить очистку WinSock даже в случае исключения.

Вы можете использовать эти функции в вашем приложении Delphi для извлечения локального имени компьютера из его IP-адреса или наоборот:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IPAddrToName(LocalIP));
end;

Альтернативно, вы можете использовать компонент TIdStack из библиотеки Indy для упрощения процесса разрешения имен хостов и IP-адресов. Например:

uses
  IdStack;

function LocalIP: string;
begin
  Result := '';
  with TIdStack.Create do
  try
    Result := GetHostAddress(nil);
  finally
    Free;
  end;
end;

В этом коде создается экземпляр компонента TIdStack, вызывается метод GetHostAddress для извлечения локального IP-адреса, а затем освобождается компонент. Возвращаемый IP-адрес возвращает строкой.

Рассмотрены два функционала для получения имени компьютера по IP-адресу с помощью функции LocalIP и функции IPAddrToName, а также предложен способ получения IP-адреса от хоста.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TCP/IP ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 12:45:53/0.0034720897674561/0