我使用以下代码,结果是正确的,但 gethostbyaddr
需要大约 30 秒。
function IPAddrToName(IPAddr: string): string;
var
SockAddrIn: TSockAddrIn;
HostEnt: PHostEnt;
WSAData: TWSAData;
begin
WSAStartup($101, WSAData);
SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
if HostEnt <> nil then
Result := StrPas(Hostent^.h_name)
else
Result := '';
end;
最佳答案
这不太可能是您的代码的问题(除非 WSAStartup
特别慢)。
我要做的第一件事是输出代码中每一行之间的时间(我认为最好是毫秒,使用 GetTickCount
),找出时间到底花在哪里。
gethostbyaddr
可能必须转到远程 DNS 计算机才能将 IP 地址解析为主机名。
如果您的网络设置不佳,或者包含该地址的 DNS 服务器位于西藏山区的偏远地区,则解析将需要一些时间。
从命令行输入:
nslookup x.x.x.x
(其中 x.x.x.x
是您感兴趣的 IP 地址)并查看需要多长时间。
根据您在下面标尺线之间的评论:
<小时/>我在 LAN 上工作,只有 3 台机器。此外,该网络未连接到互联网。仅一行就需要 16 秒(+/- 一些毫秒):
HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
同时:
GetHostByName(PChar(HostName));
是瞬时的。下面是Ping(即时输出)和nslookup的输出:
c:\> ping 192.168.1.22
Reply from 192.168.1.22: bytes=32 time<1ms TTL=128 Packets:
Sent = 4, Received = 4, Lost = 0 (0% loss)
c:\> nslookup 192.168.1.22
DNS request timed out.
<小时/>
我认为你的问题在于超时。看来您的网络设置可以进行 DNS 名称解析,但不能进行 IP 反向解析。
当您只需输入 nslookup
时,它应该会向您显示它正在尝试使用的 DNS 服务器,这可能会给您提供线索。
c:\pax> nslookup
Default Server: pax01.neveryoumind.com
Address: 9.190.230.75
将名称解析为 IP 地址可能不会通过 DNS 发出,而是使用本地信息进行处理。
这就是我根据当前信息所能为您提供的尽可能多的帮助。由于现在这看起来更像是一个 super 用户问题,而不是 StackOverflow,所以我会将其推到那里。
关于delphi - gethostbyaddr 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3446879/