libevent : 如果相关套接字被本地程序关闭,是不是可以触发事件

Posted

技术标签:

【中文标题】libevent : 如果相关套接字被本地程序关闭,是不是可以触发事件【英文标题】:libevent : whether event can be triggered if the related socket is closed by local programlibevent : 如果相关套接字被本地程序关闭,是否可以触发事件 【发布时间】:2013-06-20 13:16:39 【问题描述】:

如果我为accept()返回的连接套接字添加一个事件,如下所示

    event_set(&conn_ev, connfd, EV_READ|EV_PERSIST, on_recv, NULL);
    event_base_set(base, &conn_ev);
    event_add(&conn_ev, NULL);

如果某个时候,本地程序(而不是对等方)关闭了套接字,conn_ev 会被触发吗? 如果是,如何检测事件是否是由于套接字关闭引起的?

是 recv(connfd,..) 返回 -1 并且 errno 设置为 EBAD 还是任何其他情况?

谢谢!

【问题讨论】:

【参考方案1】:

如果套接字被另一端很好地关闭,则所有套接字都被标记为可读,read 返回零。当收到错误时,它们被标记为可读或可写,readwrite 返回-1

参见例如socket(7) manual page 用于状态表。

【讨论】:

我指的是本地程序,而不是另一端 @user1944267 您想知道自己何时关闭套接字?这取决于您来跟踪,例如从所有用于轮询的集合中移除已关闭的套接字。

以上是关于libevent : 如果相关套接字被本地程序关闭,是不是可以触发事件的主要内容,如果未能解决你的问题,请参考以下文章

pthread 向 libevent 添加一个套接字但退出

知道所有回调都使用 libevent 和 bufferevent_free 运行

Libevent bufferevent 套接字刷新

使用 libev 的套接字

Libevent 和文件 I/O

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