如何从DNS获取主机名的IP地址?

Ple*_*rds 2 delphi ip dns delphi-xe3

我有这个功能,如果我使用GetIP('server-name')GetIP('google.com')在我的Delphi 2006 中检索IP地址.

但现在我正在尝试它,Delphi-XE3它不起作用.有任何想法吗?

function GetIP(const HostName: string): string;
var
  WSAData: TWSAData;
  R: PHostEnt;
  A: TInAddr;
begin
  Result := IPNULL; // '0.0.0.0'
  WSAStartup($101, WSAData);
  R := Winsock.GetHostByName(PAnsiChar(HostName));
  if Assigned(R) then
  begin
    A := PInAddr(r^.h_Addr_List^)^;
    Result := string(WinSock.inet_ntoa(A));
  end;
end;
Run Code Online (Sandbox Code Playgroud)

似乎R没有被分配,因为结果总是如此'0.0.0.0'

Dav*_*nan 9

这两个版本的Delphi之间的最大区别在于,现代Delphi本身使用宽UTF-16编码字符串,旧版本使用ANSI编码字符串.

许多API函数都有宽版本和ANSI版本.但是你在Winsock中调用的函数只能坚持8位.

您可以通过显式使用8位文本编码使您的代码像以前一样工作.

function GetIP(const HostName: string): string; 
var 
  WSAData: TWSAData;
  R: PHostEnt; 
  A: TInAddr; 
begin 
  Result := IPNULL; // '0.0.0.0' 
  WSAStartup($101, WSAData); 
  R := Winsock.GetHostByName(PAnsiChar(AnsiString(HostName))); 
  if Assigned(R) then 
  begin 
    A := PInAddr(r^.h_Addr_List^)^; 
    Result := WinSock.inet_ntoa(A); 
  end; 
end;
Run Code Online (Sandbox Code Playgroud)

现在,细心的读者会说:

如果主机名具有非ASCII字符怎么办?受这些相当微弱的固定长度8位编码约束不是一种耻辱吗?

那么,现在将主机名转换为地址的推荐功能是Unicode函数GetAddrInfoW.

  • 出于某种原因,@ TLama没有写出这个答案.问题需要答案.没有答案,提问者没有什么可以接受的.因此我的答案. (2认同)