gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:52:27 26 4
gpt4 key购买 nike

如果我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com