Libevent как tcp клиент — почему обработчик событий завершается 1?

Решил реализовать 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?
  • Вопрос задан
  • 2730 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы