libevent 无法读取打开的套接字描述符

Posted

技术标签:

【中文标题】libevent 无法读取打开的套接字描述符【英文标题】:libevent cannot read an open socket descriptor 【发布时间】:2013-03-21 07:10:43 【问题描述】:

最近,我有一个使用 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 永远不会被调用。

传入连接被正确接受。 (叹气)

我正在等待您对这个问题的友好评论。

提前谢谢你。

【问题讨论】:

【参考方案1】:

首先,看看 Nick Mathewson 撰写的关于 libevent 的(免费)精彩书籍:

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

然后,您需要确保在调用 event_dispatch() 之前添加事件。

【讨论】:

谢谢雷米。这是一个很棒的评论。 无论如何,我已经转向使用 libev 而不是 libevent。 libev 给了我很多可靠的结果,而且很容易使用。

以上是关于libevent 无法读取打开的套接字描述符的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的蓝牙套接字的文件描述符为空?

Libevent 和文件 I/O

Windows 上的 Libev

带有 libevent/libev 的 C 或 C++:监视 unix 套接字

使用 libev 的套接字

Unix Socket - 啥是socket(套接字)?