2014-08-31 5 views
0

Мне нужно настроить сокет TCP и отправить сообщение на сервер, а затем выполнить согласование SSL с сервером и выполнить последующий обмен данными в SSL. Мне нужно использовать libevent для реализации этого, потому что он не блокируется, поэтому я могу иметь много соединений одновременно.libevent, начать SSL после

я могу получить соединение установить и обмен некоторые данные в текстовом формате:

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 

Спасибо за любые предложения.

ответ

2

Обнаружен обходной путь, освободив существующий (очистить текст) и создайте новый. Хитрость заключается в том, чтобы сохранить 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); 
0

Вы можете попробовать использовать bufferevent_openssl_filter_new(), чтобы обернуть существующий bufferevent непосредственно, вместо того, чтобы создать еще один 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);