我需要设置一个 TCP 套接字并向服务器发送消息,然后与服务器进行 SSL 协商,并在 SSL 中进行后续数据交换。我需要使用 libevent 来实现它,因为它是非阻塞的,所以我可以同时拥有多个连接。
我可以建立连接并以明文形式交换一些数据:
struct bufferevent *bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
struct sockaddr_in addr;
//fill the addr with ip and port
bufferevent_socket_connect(bev, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
//send data
evbuffer_add(bufferevent_get_output(bev), data, len);
问题是,libevent 似乎只有一个 API 来执行 SSL,但它假定尚未创建 bufferevent 对象。
bufferevent_openssl_socket_new
感谢您的任何建议。
最佳答案
通过释放现有的(明文)并创建一个新的来找到解决方法。诀窍是在销毁 bufferevent 之前保存旧的 fd。
//save the fd in the old bufferevent (cleartext)
fd = bufferevent_getfd(cb->bev);
bufferevent_setfd(cb->bev, -1);
bufferevent_free(cb->bev);
bev = bufferevent_openssl_socket_new(base, fd, ssl,
BUFFEREVENT_SSL_CONNECTING,
BEV_OPT_CLOSE_ON_FREE|BEV_OPT_DEFER_CALLBACKS);
关于c - libevent,之后启动 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25595033/