首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libevent,启动SSL后

libevent,启动SSL后
EN

Stack Overflow用户
提问于 2014-09-01 02:33:02
回答 2查看 2.2K关注 0票数 1

我需要设置一个TCP套接字并向服务器发送一条消息,然后与服务器进行SSL协商,并在SSL中进行后续的数据交换。我需要使用libevent来实现这一点,因为它是非阻塞的,所以我可以同时拥有许多连接。

我可以建立连接并以明文形式交换一些数据:

代码语言:javascript
复制
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对象。

代码语言:javascript
复制
bufferevent_openssl_socket_new

谢谢你的建议。

EN

回答 2

Stack Overflow用户

发布于 2014-09-01 21:58:54

通过释放现有的(明文)并创建一个新的,找到了解决方法。诀窍是在销毁bufferevent之前保存旧的fd。

代码语言:javascript
复制
//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);
票数 3
EN

Stack Overflow用户

发布于 2017-01-09 22:08:30

您可以尝试使用bufferevent_openssl_filter_new()直接包装现有的bufferevent,而不是从原始套接字fd创建另一个bufferevent

/** * Create a new SSL bufferevent to send its data over another bufferevent. * * @param base An event_base to use to detect reading and writing. It * must also be the base for the underlying bufferevent. * @param underlying A socket to use for this SSL * @param ssl A SSL* object from openssl. * @param state The current state of the SSL connection * @param options One or more bufferevent_options * @return A new bufferevent on success, or NULL on failure */ struct bufferevent * bufferevent_openssl_filter_new(struct event_base *base, struct bufferevent *underlying, struct ssl_st *ssl, enum bufferevent_ssl_state state, int options);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25595033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档