c - libevent,之后启动 SSL

标签 c ssl libevent

我需要设置一个 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/

相关文章:

C 堆栈实现抛出错误访问错误

关于 C 中位域排序语义的澄清

iis - HTTP 错误 403.16 - 客户端证书信任问题

c - 如何使用 libevent 库在程序中搜索和删除事件?

c - 在 32 位系统上使用 libevent 提供大文件 (>2GB)

C 方法错误

arrays - 有没有一种快速的方法来获取放入数组中的最后一个元素?

ssl - 通过 Apache JMeter 连接到自签名 SSL 网站

ssl - 当 HTTPS 站点使用 "ISRG Root X1"CA 时,Python3.4+requests 2.26 无法验证 SSL 证书 - 为什么?

ubuntu - 在 Ubuntu 12.04 上安装 tmux_1.8 时出现 libevent 错误