我需要设置一个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谢谢你的建议。
发布于 2014-09-01 21:58:54
通过释放现有的(明文)并创建一个新的,找到了解决方法。诀窍是在销毁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);发布于 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);
https://stackoverflow.com/questions/25595033
复制相似问题