Описывается функция, которая показывает, как вычислить IP адрес компьютера в интернете по его доменному имени.
Объявляем Winsock, для использования в функции:
function HostToIP(name: string; var Ip: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
gethostname (hostName, sizeof (hostName));
StrPCopy(hostName, name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) thenif Assigned (hostEnt^.h_addr_list) thenbegin
addr := hostEnt^.h_addr_list^;
if Assigned (addr) thenbegin
IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
Result := True;
endelse
Result := False;
endelse
Result := False
elsebegin
Result := False;
end;
finally
WSACleanup;
endend;
Вы можете разместить на форме Edit, Кнопку и Label и добавить к кнопке следующий обработчик события OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var
IP: string;
beginif HostToIp(Edit1.Text, IP) then
Label1.Caption := IP;
end;
Перевод контента на русский язык:
Программа Delphi, функция HostToIP, конвертирует доменное имя в IP-адрес с помощью Windows Sockets API (Winsock). Функция принимает два параметра: name - доменное имя, и Ip - переменная для хранения результата.
Разбор работы кода:
Сначала инициализируется Winsock с помощью функции WSAStartup.
Затем получается hostname локального компьютера с помощью функции gethostname и копируется в массив hostName.
Функция StrPCopy используется для копирования доменного имени из контрола Edit1 (предполагается, что это текстовый редактор на форме) в массив hostName.
Затем функция gethostbyname используется для разрешения hostname в IP-адрес. Она возвращает указатель на PHostEnt, который проверяется на присваивание с помощью функции Assigned.
Если разрешение успешно, то получается первый IP-адрес из списка адресов, возвращенных gethostbyname, и копируется в массив addr.
Функция Format используется для конвертации IP-адреса из бинарного представления (четыре байта) в строку в формате, понятном человеку (например, "192.168.1.1").
Наконец, результат хранится в переменной IP и присваивается caption контрола Label1.
Событийный обработчик Button1Click используется для вызова функции HostToIp с доменным именем из контрола Edit1 как аргументом. Если разрешение успешно, то обновляется caption контрола Label1 с результатом IP-адреса.
Сuggestions for improvement:
Обработка ошибок: код не обрабатывает ошибки хорошо. Например, если функция gethostbyname не может разрешить hostname, код просто возвращает False. Лучше было бы поймать конкретные условия ошибок и предоставить более информативные сообщения ошибках.
Организация кода: код очень плотный и мог бы быть разбит на меньшие функции или процедуры с ясными именами. Это было бы проще для чтения и обслуживания.
Безопасность типов: некоторые конверсии типов (например, PChar в string) не являются явно типизированными, что может привести к ошибкам на этапе выполнения. Лучше было бы использовать явные типизации конверсий типов, когда это возможно.
Вот альтернативное решение с использованием библиотеки Indy, которая предоставляет более современный и надежный способ работы с сокетами:
Код использует класс THost из библиотеки Indy для разрешения hostname в IP-адрес. Метод HostToAddress принимает hostname и строковый параметр output для результата IP-адреса. Если разрешение успешно, то возвращает True, иначе возвращает False.
Данная статья описывает функцию на языке Delphi, которая преобразует доменное имя в IP-адрес компьютера в интернете.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.