我正在编写一个类,负责使用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));
错误C2664'无效SSL_set_psk_find_session_callback(SSL *,SSL_psk_find_session_cb_func)':无法将参数2从'std :: _ Binder'转换为'SSL_psk_find_session_cb_func'
编辑:有多个从多个线程调用的OpenSSLHandler实例-处理同时连接
答案 0 :(得分:3)
每个连接都有专用于该连接的唯一SSL *
。该值将传递给您的回调函数。
您不能指定用于通过OpenSSL接口进行实例方法调用的类实例-严格来说,它是C而不是C ++。
在std::map<SSL *,OpenSslHandler *>
回调函数中使用extern "C"
或类似的数据结构来查找正确的类实例,以用于调用实例方法。只需确保正确地互斥保护您的数据结构即可。
或者,您可以在建立SSL *
连接时使用SSL_set_ex_data()
,并为该OpenSslHandler *
连接设置一个指向OpenSslHandler
实例的SSL *
指针,然后使用SSL_get_ex_data()
检索指针-再次在extern "C"
回调函数中。
要使用get / set方法,首先需要通过调用SSL_get_ex_new_index()
创建唯一索引。返回的整数索引可以存储在静态类变量中。它在您的应用程序中是唯一的,可以与所有SSL对象一起使用来获取/设置Ex_Data。
答案 1 :(得分:0)
按照惯例,大多数库都允许您将任意用户数据传递给回调,但是这里似乎并非如此。
一些替代方法:
OpenSslHandler
std::map<SSL_CTX*, OpenSslHandler*>
中存储指向SSL_psk_find_session_cb_func
的(共享)指针。在您的SSL_CTX
中,通过SSL_get_SSL_CTX
恢复OpenSslHandler
指针,并使用该指针在地图中查找{{1}}。