Как я могу вызвать тайм-аут ldap_simple_bind_s? - PullRequest
2 голосов
/ 03 декабря 2009

Недавно у нас была проблема с нашим тестовым сервером LDAP - он завис и не отвечал на запросы. В результате наше приложение зависло навсегда * при попытке привязки к нему. Это происходило только на машинах Unix - в Windows время ожидания вызова ldap_simple_bind_s истекло примерно через 30 секунд.

* Я не знаю, действительно ли это было навсегда , но это было по крайней мере несколько минут.

Я добавил вызовы к ldap_set_option, попробовав оба LDAP_OPT_TIMEOUT и LDAP_OPT_NETWORK_TIMEOUT, но вызов связывания все еще завис. Есть ли какой-нибудь способ сделать ldap_simple_bind_s тайм-аут после некоторого периода моего выбора?

Ответы [ 2 ]

1 голос
/ 10 декабря 2009

Здесь происходит несколько вещей.

В основном LDAP SDK не работает; в зависимости от спецификации он должен был истечь в зависимости от значения, которое вы отправили в ldap_set_option. К сожалению, это не так. Ваше связывание, вероятно, в конечном итоге истечет, но это произойдет до тех пор, пока ОС не вернет ошибку, и это произойдет из-за тайм-аута TCP или нескольких кратных этого таймаута.

Вы можете обойти это, используя ldap_simple_bind (), а затем несколько раз вызывая ldap_result (). Если вы не получите результат в течение заданного времени ожидания, вы можете вызвать ldap_abandon_ext (), чтобы сообщить SDK об отказе.

Конечно, поскольку вы пытаетесь связать это, вы почти наверняка оставите соединение в непригодном для использования состоянии, поэтому вам нужно будет немедленно отсоединить его.

Надеюсь, это поможет.

0 голосов
/ 02 октября 2013

ОБНОВЛЕНИЕ: приведенный ниже код работает только на openldap 2.4+. openLdap 2.3 не соблюдает LDAP_OPT_TIMEOUT, без которого ldap_simple_bind_s не истечет время ожидания независимо от того, что вы установили. Вот ссылка с форума openLdap

Я использую ldap_simple_bind_s в моей службе аутентификации LDAP и с настройкой 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;
          }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...