Мой домашний компьютер используется на 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 = nilthen Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
I := 0;
while pPtr^[I] <> nildobegin
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 <> nilthen
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 = nilthen Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
i := 0;
while pPtr^[i] <> nildobegin
Result := inet_ntoa(pptr^[i]^);
Inc(i);
end;
WSACleanup;
end;
Программный код, предоставленный вами, написан на языке Delphi и использует библиотеку WinSock для взаимодействия с сетью. Он предназначен для извлечения локального имени компьютера из его IP-адреса или наоборот.
Вот некоторые наблюдения и предложения:
Функция LocalIP извлекает локальный IP-адрес компьютера, вызывая функцию GetHostName, а затем парсит возвращенное имя хоста с помощью функции GetHostByName. Это подход не очень эффективен, так как он требует множества системных вызовов для извлечения IP-адреса.
Функция IPAddrToName принимает IP-адрес в качестве входного параметра и возвращает соответствующее имя хоста. Она использует функцию gethostbyaddr для разрешения IP-адреса к имени хоста.
Функция GetIPFromHost принимает имя хоста в качестве входного параметра и возвращает соответствующий IP-адрес(ы). Она использует функцию GetHostByName для извлечения структуры hostent, которая содержит список IP-адресов, связанных с именем хоста.
Чтобы улучшить этот код:
Вместо парсинга имени хоста, возвращенного функцией GetHostName, можно использовать функции gethostbyname или getaddrinfo для извлечения IP-адреса напрямую.
Можно использовать компонент TIdStack из библиотеки Indy (популярной библиотеки Delphi для сетевого программирования) для упрощения процесса разрешения имен хостов и IP-адресов.
Обратите внимание, что я удалил переменную GInitData и использовал значение nil вместо нее, так как она не необходима для инициализации WinSock явно. Кроме того, я упростил код, используя блок try-finally, чтобы обеспечить очистку WinSock даже в случае исключения.
Вы можете использовать эти функции в вашем приложении Delphi для извлечения локального имени компьютера из его IP-адреса или наоборот:
В этом коде создается экземпляр компонента TIdStack, вызывается метод GetHostAddress для извлечения локального IP-адреса, а затем освобождается компонент. Возвращаемый IP-адрес возвращает строкой.
Рассмотрены два функционала для получения имени компьютера по IP-адресу с помощью функции LocalIP и функции IPAddrToName, а также предложен способ получения IP-адреса от хоста.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.