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