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
返回零。当收到错误时,它们被标记为可读或可写,read
或 write
返回-1
。
参见例如socket(7) manual page 用于状态表。
【讨论】:
我指的是本地程序,而不是另一端 @user1944267 您想知道自己何时关闭套接字?这取决于您来跟踪,例如从所有用于轮询的集合中移除已关闭的套接字。以上是关于libevent : 如果相关套接字被本地程序关闭,是不是可以触发事件的主要内容,如果未能解决你的问题,请参考以下文章