2010-08-10 191 views
4

我使用下面的代码,结果是正确的,但gethostbyaddr大约需要30秒。gethostbyaddr太慢

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; 

问候 艾伦

+2

这通常是一个DNS问题。 – sje397 2010-08-10 07:35:52

+0

通常情况,是的,但是直到我们从代码中获得时间后,我们才肯定知道。否则,我会马上将它推到SU上。 – paxdiablo 2010-08-10 07:42:30

+0

比较'nslookup'和这个调用,看它是否有很大的不同。如果没有,那肯定是一个DNS问题。 – 2010-08-15 13:30:44

回答

1

Windows根据主机和LAN的配置方式,尝试使用不同方法执行主机名解析。见http://technet.microsoft.com/en-us/library/bb727005.aspx。 您不应该在未正确配置的局域网中使用DNS服务器(或至少一个WINS服务器)或正确的主机文件来测试该代码。否则,您无法在正确配置的LAN中获得您期望的结果。