Delphi的gethostbyaddr实现,为何查询速度如此缓慢?

2026-04-10 16:232阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计508个文字,预计阅读时间需要3分钟。

Delphi的gethostbyaddr实现,为何查询速度如此缓慢?

使用以下代码替代,确保不超过100个字符:

csharpstring IPAddrToName(string IPAddr): string;var SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; WSAData: TWSAData;WSAStartup(101, WSAData);SockAddrIn.sin_addr=IPAddr;

我使用以下代码,结果是正确的,但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地址)并查看需要多长时间.

根据你在下面标尺线之间的评论:

我只使用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反向解析.

Delphi的gethostbyaddr实现,为何查询速度如此缓慢?

当你输入nslookup时,它应该显示你正在尝试使用的DNS服务器,这可能会给你一个线索.

c:\pax> nslookup Default Server: pax01.neveryoumind.com Address: 9.190.230.75

可能是将名称解析为IP地址不会通过DNS传出,而是通过本地信息处理.

这对我提供当前信息的帮助很大.既然现在看起来非常像SuperUser问题而不是StackOverflow,我会把它推到那里.

本文共计508个文字,预计阅读时间需要3分钟。

Delphi的gethostbyaddr实现,为何查询速度如此缓慢?

使用以下代码替代,确保不超过100个字符:

csharpstring IPAddrToName(string IPAddr): string;var SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; WSAData: TWSAData;WSAStartup(101, WSAData);SockAddrIn.sin_addr=IPAddr;

我使用以下代码,结果是正确的,但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地址)并查看需要多长时间.

根据你在下面标尺线之间的评论:

我只使用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反向解析.

Delphi的gethostbyaddr实现,为何查询速度如此缓慢?

当你输入nslookup时,它应该显示你正在尝试使用的DNS服务器,这可能会给你一个线索.

c:\pax> nslookup Default Server: pax01.neveryoumind.com Address: 9.190.230.75

可能是将名称解析为IP地址不会通过DNS传出,而是通过本地信息处理.

这对我提供当前信息的帮助很大.既然现在看起来非常像SuperUser问题而不是StackOverflow,我会把它推到那里.