2010-08-31 2 views
3

Если вызов SSL_accept не удается, я хочу просто выручить.Как очистить плохое соединение OpenSSL

В настоящее время я вызываю SSL_shutdown, а затем SSL_free, но с момента его реализации у двух клиентов произошли сбои в OpenSSL (при вызове SSL_accept в более позднее время), поэтому я предполагаю, что это не самое лучшее способ очистки.

Документы говорят, что SSL_shutdown используется для правильной очистки, и его, возможно, нужно будет вызывать дважды (хотя, если SSL_accept не удалось, я бы не подумал, что это будет так). SSL_clear - это еще один вариант, но похоже, что это больше связано с сбросом соединения.

SSL_free уменьшает счетчик ссылок и удаляет соединение, если количество ссылок достигает 0. Я знаю, что у моего кода нет ссылок, но может быть «сеанс»?

Есть ли окончательный способ полностью закрыть/выключить/освободить объект SSL с помощью OpenSSL?

ответ

3

Как только вы вызвали SSL_free() на объект SSL, вы не должны использовать его снова. Вы должны убедиться, что новый SSL создан с SSL_new() для последующего SSL_accept().

+0

Я не могу повторно использовать SSL * после вызова SSL_free. Итак, как только я вызываю SSL_free(), это все, что мне нужно сделать, чтобы очистить его? Независимо от того, какие ошибки или подключения произошли ранее? – DougN

+0

@DougN: Правильно. Обратите внимание, что 'SSL_free()' также освобождает базовые BIOs - может ли это быть источником вашей проблемы? – caf

+0

Я на 99% уверен, что BIO не освобождены. Насколько мне известно, это просто SSL_shutdown, а затем SSL_free. Затем ничего не трогается. Угадайте, я делаю это правильно (но дважды проверю BIO) - надеюсь, что аварии - это просто совпадение ... Спасибо за помощь. – DougN

Смежные вопросы