libevent не может прочитать дескриптор открытого сокета

недавно у меня была небольшая программа сервера сокетов, использующая libevent.

Таким образом, он выполняет следующую работу.

void read_function(int fd, short event, void* arg) {
    printf("callback is called!\n");

    // read from fd, and send a reply to fd!
}

void accept_thread_function() {
    int fd = accept(...);
    struct event* ev_read = new struct event();
    memset(ev_read, 0, sizeof(struct event));
    event_set(ev_read, fd, EV_READ|EV_PERSIST,read_function,ev_read);
    event_add(ev_read, 0);
}

int main() {
    event_init();
    THREAD a = start 'accept_thread_function' as a thread;
    event_dispatch();
    THREAD::join(a);
}

Проблема в том, что read_function никогда не вызывается.

Входящее соединение корректно принимается. (вздох)

Я жду вашего доброго комментария об этой проблеме.

Заранее спасибо.


person Byungjoon Lee    schedule 21.03.2013    source источник


Ответы (1)


Во-первых, взгляните на (бесплатную) замечательную книгу о libevent, написанную Ником Мэтьюсоном:

http://www.wangafu.net/~nickm/libevent-book/Ref1_libsetup.html#_locks_and_threading

Затем вам нужно убедиться, что событие добавлено перед вызовом event_dispatch().

person Remi Gacogne    schedule 22.03.2013
comment
Спасибо, Реми. Это был отличный комментарий. - person Byungjoon Lee; 29.03.2013
comment
Во всяком случае, я перешел на использование libev вместо libevent. libev дал мне много надежных результатов, и его было легко использовать. - person Byungjoon Lee; 29.03.2013