Решил реализовать tcp клиент на libevent. Разбираюсь по циклу статей:
www.ibm.com/developerworks/ru/library/l-Libevent3
Попробовал использовать оттуда листинг №1:
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void bufev_callback( struct bufferevent *buf_ev, short events, void *ptr )
{
if( events & BEV_EVENT_CONNECTED )
{
printf( "Соединение установлено\n" );
/* Здесь можно было бы выполнить и более полезные операции,
* например, чтение или запись данных
*/
}
else if( events & BEV_EVENT_ERROR )
{
exit(-1);
/* Перед принудительным завершением программы при необходимости
* выполняются "спасательные действия" (освобождение памяти,
* закрытие файлов и т.д.), если это возможно
*/
}
}
int main( void )
{
struct event_base *base;
struct bufferevent *buf_ev;
struct sockaddr_in sin;
base = event_base_new();
memset( &sin, 0, sizeof(sin) );
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr( "127.0.0.1" );
sin.sin_port = htons( 7824 );
buf_ev = bufferevent_socket_new( base, -1, BEV_OPT_CLOSE_ON_FREE );
bufferevent_setcb( buf_ev, NULL, NULL, bufev_callback, NULL );
if( bufferevent_socket_connect( buf_ev, (struct sockaddr *)&sin, sizeof(sin) ) < 0 )
{
/* Попытка установить соединение была неудачной */
bufferevent_free( buf_ev ); /* сокет закроется автоматически; см. флаг при создании */
return -1;
}
int result = event_base_dispatch( base );
printf("event_base_dispatch: %d", result);
return 0;
}
На выходе получаю:
Соединение установлено
event_base_dispatch: 1
Process finished with exit code 0
Не могу понять почему обработчик событий завершается, возвращая 1 (по документации сказано, что функция возвращает: 0 if successful, -1 if an error occurred, or 1 if no events were registered.). Помогите понять из-за чего такое поведение, что событий зарегистрированных нет – я же добавил событие с помощью bufferevent_socket_new?