首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 依 IP 位址反查主機名稱:Winsock gethostbyaddr 實作

     編輯:Delphi

核心 API

gethostbyaddr:依 IPv4 位址 (in_addr) 反向解析主機名稱 (PTR 記錄)。需搭配 inet_addr 將字串 IP 轉為 in_addr。

完整函數

uses Winsock, SysUtils;

function GetHostNameByIP(const IP: string): string;
var
  WSAData: TWSAData;
  Addr: TInAddr;
  HostEnt: PHostEnt;
begin
  Result := '';
  if WSAStartup($0202, WSAData) <> 0 then Exit;
  try
    Addr.S_addr := inet_addr(PAnsiChar(AnsiString(IP)));
    if Addr.S_addr = INADDR_NONE then Exit; // 格式錯誤
    HostEnt := gethostbyaddr(@Addr, SizeOf(Addr), PF_INET);
    if HostEnt <> nil then
      Result := StrPas(HostEnt.h_name);
  finally
    WSACleanup;
  end;
end;

表單使用範例

procedure TForm1.btnResolveClick(Sender: TObject);
begin
  edtHostName.Text := GetHostNameByIP(edtIP.Text);
  if edtHostName.Text = '' then
    ShowMessage('無法解析,可能無 PTR 記錄或 IP 格式錯誤');
end;

注意事項

  • 依賴 DNS 伺服器正確設定 PTR (逆向查詢) 記錄,內網環境常缺失導致解析失敗。
  • gethostbyaddr 僅支援 IPv4;IPv6 需使用 GetNameInfoW (Win32 API) 或 TIdStack.ResolveHost (Indy)。
  • 解析過程會阻塞,若在主執行緒呼叫可能導致 UI 短暫凍結,建議放入背景執行緒。

Indy 跨平台版本

uses IdStack;

function GetHostNameByIP_Indy(const IP: string): string;
begin
  Result := GStack.ResolveHost(IP); // 內部處理 IPv4/IPv6、非阻塞可選
end;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved