2012-12-10 77 views
0

我使用Windows附带的WinLDAP.DLL连接到不同的LDAP服务器(1x OpenLDAP,1x Active Directory)。编程语言是Delphi,但这可能与此无关。为什么ldap_connect速度慢?

在使用服务器名称而不是IP地址时,在几种配置中,“ldap_connect”的调用非常慢(6-7秒)。 ping或者查找同一台服务器的nslookup并不慢。为什么只有ldap连接才会变慢?有什么我可以检查以确定问题?

编辑:WMware在我的电脑上安装了2个虚拟以太网适配器。如果我取消激活这些适配器,ldap_connect会快2-3倍。它不能完全解决问题,但它可能有助于找到解释。

+0

能否请你告诉我们什么是你的“连接字符串”?即你做无服务器绑定(domain.lab)还是你指定域控制器的名称?或者最好向我们展示至少ldap_bind/ldap_init/ldap_connect程序的一部分。您的开发机器是否也加入了AD域? –

+0

另外,连接到LDAP服务器时是否使用Netbios或DNS名称? –

+0

您可以通过执行2个wireshark/tcpdump跟踪来验证延迟,一个在您的计算机上,一个在LDAP服务器上。 – whosrdaddy

回答

1

这几乎可以肯定是DNS配置错误。检查你的nslookup和反向查找时间。

+0

感谢您的答案,但nslookup请求总是很快。直到现在,我只看到了ldap连接的问题。 – Name

1

LDAP服务器正在执行reverse DNS lookup的机会很大。

+0

谢谢,这可能是为什么nslookup速度快,速度慢。我会看看链接中的建议。但是,因为我在OpenLDAP和AD服务器上遇到同样的问题,所以问题不在于服务器端,而在客户端(但我不知道它会是什么......) – Name

0

我仍然不知道,为什么连接速度慢,如果我使用服务器名称而不是IP地址。但是为了解决这个问题,我决定自己解析IP地址,而不是让WINLDAP.dll去做。

它可以通过一个函数这样一个简单地实现:

function GetIPAddress(const HostName: AnsiString): AnsiString; 
var 
    HostEnt: PHostEnt; 
    Host: AnsiString; 
    SockAddr: TSockAddrIn; 
begin 
    Result := ''; 
    Host := HostName; 
    if Host = '' then 
    begin 
    SetLength(Host, MAX_PATH); 
    GetHostName(PAnsiChar(Host), MAX_PATH); 
    end; 
    HostEnt := GetHostByName(PAnsiChar(Host)); 
    if HostEnt <> nil then 
    begin 
    SockAddr.sin_addr.S_addr := Longint(PLongint(HostEnt^.h_addr_list^)^); 
    Result := inet_ntoa(SockAddr.sin_addr); 
    end; 
end;