libevent 如何检测到套接字已关闭

Posted

技术标签:

【中文标题】libevent 如何检测到套接字已关闭【英文标题】:how libevent detect that a socket is closed 【发布时间】:2013-05-22 22:52:29 【问题描述】:

如果我将特定套接字的事件添加到事件循环, 例如,一个 TCP 连接套接字。 那么可能会发生套接字关闭, 那么 libevent 将如何行动呢? 它可以检测到这个吗?

谢谢!

【问题讨论】:

您的标题和您的问题不一致。您的标题的答案是它没有检测到对等方的关闭,它只是检测到一个读取事件。 【参考方案1】:

编辑:我想我一开始误解了你的问题。

如果你的意思是从远端关闭socket

根据文档,您可以使用event_new()event_add() 调用来注册对套接字的兴趣。确保指定EV_READ,因为您对套接字何时关闭感兴趣。

请记住,可供读取的数据和关闭的套接字之间的文件描述符准备情况没有区别。通常您必须阅读套接字以找出哪个条件为真,但如果您不想阅读套接字,则可以查看here 以获得提示。

如果你的意思是socket本地关闭(文件描述符被关闭了

在关闭文件描述符后使用它永远不会被定义,并且总是会导致未定义的结果。这不是特定于 libevent。在关闭文件描述符之前,您必须确保程序中没有其他线程正在使用它,并且您必须确保程序的其他部分将来不会尝试使用它。这意味着在您关闭它的同时从 libevent 注销文件描述符。

【讨论】:

那么如何检查socket是否关闭? 对不起,我误解了你的问题。您的意思是套接字的本地端(本地文件描述符)已关闭,对吗?如果是这样,我会写一个不同的答案,但归结为“永远不要那样做”。 好的,你能解释一下这两种情况吗:1本地socket关闭2远程socket关闭。谢谢! 我认为对于第一种情况,我应该检查返回值,n=recv(fd,...) 如果 n = 0,则表示远程套接字发送 FIN/ACK ,如果 n=-1,则可能是RST数据包与否

以上是关于libevent 如何检测到套接字已关闭的主要内容,如果未能解决你的问题,请参考以下文章

为啥不尝试 I/O 就不可能检测到 TCP 套接字已被对等方优雅地关闭?

如何检测远程侧套接字关闭? [复制]

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

如何检测 Windows 中打开的套接字?

Windows 上的 Libev

TCP 套接字关闭但未被进程检测到