最近我们的测试LDAP服务器出现了一个问题--它挂起了,无法响应请求。结果,我们的应用程序在尝试绑定到它时永远挂起了。这种情况只发生在Unix机器上,在Windows上,ldap_simple_bind_s
调用在大约30秒后超时。
- 我不知道这是否真的是“永远”,但至少有几分钟。
我添加了对ldap_set_option
的调用,尝试了LDAP_OPT_TIMEOUT
和LDAP_OPT_NETWORK_TIMEOUT
,但是bind调用仍然挂起。有没有办法让ldap_simple_bind_s
在我选择的一段时间后超时?
3条答案
按热度按时间toe950271#
这里发生了几件事。
LDAP SDK基本上是坏的;根据规范,它应该根据您在ldap_set_option中发送的值超时。不幸的是,它没有正确地这样做。您的绑定可能最终会超时,但它不会,直到操作系统返回一个失败,这将来自TCP超时或该超时的一些倍数。
你可以通过使用ldap_simple_bind(),然后调用ldap_result()几次来解决这个问题。如果你没有在你想要的超时内得到结果,你可以调用ldap_abande_ext()来告诉SDK放弃。
当然,由于您正在尝试绑定,这几乎肯定会使连接处于不可用状态,因此您需要立即解除绑定。
希望这个有用。
1hdlvixo2#
更新:以下代码仅适用于openldap 2.4+。openLdap 2.3不荣誉LDAP_OPT_TIMEOUT,否则无论您如何设置,ldap_simple_bind_s都不会超时。以下是来自openLdap论坛的link
我在LDAP认证服务中使用ldap_simple_bind_s,并设置了LDAP_OPT_TIMEOUT、LDAP_OPT_TIMELIMIT和LDAP_OPT_NETWORK_TIMEOUT;如果LDAP服务器不可用,它将成功超时。
下面是我的LDAP连接方法的代码摘录:
enxuqcxy3#
尝试指定选项LDAP_OPT_TCP_USER_TIMEOUT-如果此选项在您的Ldap SDK中可用。对于OpenLdap和Linux,它工作得很好-如果在此超时时间内没有TCP应答,同步操作将终止。
参见man page