delphi - gethostbyaddr 太慢

标签 delphi network-programming delphi-2007

我使用以下代码,结果是正确的,但 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/

相关文章:

delphi - 如何在 64 位窗口上调整大小时更新表单?

xml - 无法使用 Delphi 中的 XML 绑定(bind)解析 XML 文本中的值

java字符串检测ip

delphi - 如何在 Delphi 2007 上显示透明 PNG?

linux - 如何读取已重定向到本地主机的 tcp 数据包?

linux - 如何 SO_REUSEADDR | SO_REUSEPORT 在 setsockopt 中有效吗?

Delphi 2007 变量类型初始化

delphi - 需要多线程内存管理器

delphi - 当我声明通用 "array of T"时,我应该如何处理内部错误?

delphi - 发送打印机特定命令