C语言 如何使ldap_simple_bind_s超时?

bvn4nwqk  于 2023-01-08  发布在  其他
关注(0)|答案(3)|浏览(137)

最近我们的测试LDAP服务器出现了一个问题--它挂起了,无法响应请求。结果,我们的应用程序在尝试绑定到它时永远挂起了。这种情况只发生在Unix机器上,在Windows上,ldap_simple_bind_s调用在大约30秒后超时。

  • 我不知道这是否真的是“永远”,但至少有几分钟。

我添加了对ldap_set_option的调用,尝试了LDAP_OPT_TIMEOUTLDAP_OPT_NETWORK_TIMEOUT,但是bind调用仍然挂起。有没有办法让ldap_simple_bind_s在我选择的一段时间后超时?

toe95027

toe950271#

这里发生了几件事。
LDAP SDK基本上是坏的;根据规范,它应该根据您在ldap_set_option中发送的值超时。不幸的是,它没有正确地这样做。您的绑定可能最终会超时,但它不会,直到操作系统返回一个失败,这将来自TCP超时或该超时的一些倍数。
你可以通过使用ldap_simple_bind(),然后调用ldap_result()几次来解决这个问题。如果你没有在你想要的超时内得到结果,你可以调用ldap_abande_ext()来告诉SDK放弃。
当然,由于您正在尝试绑定,这几乎肯定会使连接处于不可用状态,因此您需要立即解除绑定。
希望这个有用。

1hdlvixo

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连接方法的代码摘录:

int opt_timeout     = 4;               // LDAP_OPT_TIMEOUT
  int timelimit       = 4;               // LDAP_OPT_TIMELIMIT
  int network_timeout = 4;               // LDAP_OPT_NETWORK_TIMEOUT
  int status = 0;

      // Set LDAP operation timeout(synchronous operations)

      if ( opt_timeout > 0 )
      {

          struct timeval optTimeout;
          optTimeout.tv_usec = 0;
          optTimeout.tv_sec = opt_timeout;

          status = ldap_set_option(connection, LDAP_OPT_TIMEOUT, (void *)&optTimeout);
          if ( status != LDAP_OPT_SUCCESS )
          {
              return false;
          }
      }

      // Set LDAP operation timeout
      if ( timelimit > 0 )
      {
          status = ldap_set_option(connection, LDAP_OPT_TIMELIMIT, (void *)&timelimit);
          if ( status != LDAP_OPT_SUCCESS )
          {
              return false;
          }
      }

      // Set LDAP network operation timeout(connection attempt)
      if ( network_timeout > 0 )
      {
          struct timeval networkTimeout;
          networkTimeout.tv_usec = 0;
          networkTimeout.tv_sec = network_timeout;

          status = ldap_set_option(connection, LDAP_OPT_NETWORK_TIMEOUT, (void *)&networkTimeout);
          if ( status != LDAP_OPT_SUCCESS )
          {
              return false;
          }
      }
enxuqcxy

enxuqcxy3#

尝试指定选项LDAP_OPT_TCP_USER_TIMEOUT-如果此选项在您的Ldap SDK中可用。对于OpenLdap和Linux,它工作得很好-如果在此超时时间内没有TCP应答,同步操作将终止。
参见man page

相关问题