我正在编写一个使用 OpenSSL 处理加密相关工作的类。如何为 PSK 相关回调指定类的方法?
SSL_set_psk_find_session_callback 和 SSL_set_psk_use_session_callback
已尝试 std::bind,但出现编译错误:
SSL_set_psk_find_session_callback(ssl, bind(&OpenSslHandler::psk_find_session_cb, this));
Error C2664 'void SSL_set_psk_find_session_callback(SSL *,SSL_psk_find_session_cb_func)': cannot convert argument 2 from 'std::_Binder' to 'SSL_psk_find_session_cb_func'
编辑:有多个 OpenSSLHandler 实例从多个线程调用 - 以处理同时连接
最佳答案
每个连接都有一个唯一的 SSL *
专用于该连接。该值将传递给您的回调函数。
您不能指定类实例以用于通过 OpenSSL 接口(interface)进行实例方法调用 - 它严格是 C 而不是 C++。
使用 std::map<SSL *,OpenSslHandler *>
或 extern "C"
中的类似数据结构回调函数来找到合适的类实例来调用实例方法。只需确保正确互斥保护您的数据结构即可。
或者,您可以使用 SSL_set_ex_data()
当你得到你的 SSL *
连接,并设置一个 OpenSslHandler *
指向 OpenSslHandler
的指针实例 SSL *
连接,然后使用 SSL_get_ex_data()
检索指针 - 再次在 extern "C"
中回调函数。
要使用get/set 方法,您首先需要通过调用 SSL_get_ex_new_index()
创建一个唯一索引。 .返回的整数索引可以存储在静态类变量中。它在您的应用程序中是唯一的,可以与所有 SSL 对象一起使用以获取/设置 Ex_Data。
关于c++ - 将类方法设置为 OpenSSL 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59160457/