libtls: select() и tls_read() работают вместе

Я хочу добавить поддержку ssl в старое приложение чата, которое я написал несколько лет назад. Я много читал об OpenSSL и LibreSSL и решил попробовать новый API libtls. Я думаю, что разработчики проделали отличную работу над этим. Я обнаружил, что его очень легко использовать - практически нет изменений в моем существующем коде, где это необходимо. Но вот что мне нужно выяснить сейчас:

В свое время я использовал select() для мониторинга сокетов и recv() для чтения данных. Это было легко, потому что обе эти функции работают с дескрипторами файлов.

Теперь, с libtls, функция tls_read() требует контекст tls в качестве первого аргумента. Это означает, что мне нужно искать в списке клиентов, чтобы получить соответствующий контекст tls каждый раз, когда у меня есть готовый для чтения дескриптор. Это не так сложно, но, может быть, кто-то знает лучшее решение? Я буду признателен за все комментарии и примеры кода.

1 ответ

Если я не читаю документацию, мне кажется, что если вы создаете сокеты самостоятельно, а затем используете tls_connect_fds/tls_connect_socket/tls_accept_fds/tls_accept_socket после этого у вас будут нормальные файловые дескрипторы, которые вы можете использовать с select()/poll()/так далее. Вы все еще должны были бы держать некоторый вид файлового дескриптора для сопоставления контекста, чтобы фактически выпустить tls_read/tls_write как только вы будете готовы, но это только ваш выбор связанного списка или хеш-таблицы, в зависимости от того, какой язык вы используете и какой stdlib у вас есть.

Другие вопросы по тегам