我使用以下代码,结果是正确的,但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;
此致 艾伦
答案 0 :(得分:3)
这不太可能是您的代码的问题(除非WSAStartup
特别慢)。
第一个我要做的就是在代码中的每一行之间输出时间(最好是毫秒,我认为GetTickCount
),以找出确切地说,花费的时间在哪里。
gethostbyaddr
可能必须转到远程DNS计算机才能将IP地址解析为主机名。
如果您的网络设置不当,或者包含该地址的DNS服务器位于西藏山区的偏远地区,则解决方案将需要一些时间。
在命令行中输入:
nslookup x.x.x.x
(其中x.x.x.x
是您感兴趣的IP地址)并查看需要多长时间。
根据您在下面标尺行之间的评论:
我只使用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传出,而是通过本地信息处理。
这对我提供当前信息的帮助很大。既然现在看起来非常像SuperUser问题,而不是StackOverflow,我会把它推到那里。
答案 1 :(得分:1)
Windows尝试使用不同的方法来执行主机名解析,具体取决于主机和LAN的配置方式。见http://technet.microsoft.com/en-us/library/bb727005.aspx。 您不应该使用DNS服务器(或至少是WINS服务器)或更正主机文件在未正确配置的LAN中测试该代码。否则,您无法在正确配置的LAN中获得预期的结果。