2014-08-31 3 views
0

뒤에 SSL을 시작하십시오. TCP 소켓을 설정하고 서버에 메시지를 보낸 다음 서버와의 SSL 협상을 수행하고 SSL에서 후속 데이터 교환을 수행해야합니다. 동시에 차단할 수 있기 때문에 이것을 구현하려면 libevent를 사용해야합니다.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는 SSL을 수행하는 하나의 API를 갖고있는 것 같아요,하지만 bufferevent 객체가 아직 생성되지 않은 가정 .

bufferevent_openssl_socket_new 

의견을 보내 주셔서 감사합니다.

답변

2

기존 텍스트를 삭제하고 새로운 텍스트를 만들어 해결 방법을 찾았습니다. 트릭은 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); 
0
대신, 직접 기존 bufferevent 포장 원시 소켓 FD

/** * 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);

에서 다른 bufferevent을 만드는 데 사용 bufferevent_openssl_filter_new()을 시도 할 수 있습니다