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

标签 delphi dns ip delphi-xe3

如果我在 Delphi 2006 中使用 GetIP('server-name')GetIP('google.com'),我可以使用此函数检索 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;

似乎没有分配R,因为结果始终是'0.0.0.0'

最佳答案

这两个版本的 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;
<小时/>

现在,细心的读者会说:

What if the host name has non-ASCII characters? Isn't it a shame to be constrained by these rather feeble fixed length 8 bit encodings?

嗯,现在推荐的将主机名翻译为地址的函数是 Unicode 函数 GetAddrInfoW .

关于delphi - 如何从 DNS 中获取主机名的 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18254209/

相关文章:

ruby-on-rails - Ruby/Rails 中 CIDR 的 IP 范围?

java - 用Java测试互联网是否打开?

delphi - 是否有用于Delphi/Free Pascal的免费JMS客户端?

Delphi SetLength 自定义索引

delphi - 自定义列表组件,类似于TListBox

regex - 需要用一个已知的主机名grep/etc/hosts,然后从/etc/hosts中抓取该主机名的ip地址

c# - UserHostAddress 的奇怪行为

macos - 在 OS X 上运行 Delphi 10 Seattle 应用程序时出现 Dylib 版本错误

python - 导入错误 : No module named dns. 消息

linux - 如何让 dhclient 知道 namespace ?