【问题标题】:TCP sockets never get closedTCP 套接字永远不会关闭
【发布时间】:2013-01-19 00:38:45
【问题描述】:

我有一个正在运行的pselect 正在等待 TCP 连接。 pselect 在它自己的线程中运行,因此我有一堆在运行。

我在那些pselect 上设置了超时,但是,当我运行sockstat 时,我似乎有一些永远不会关闭的连接。他们中的 99% 都这样做。当我关闭完全建立连接的客户端时,我会认为在超时时间之后,我将能够关闭这些套接字。我设置了断点来检查返回值是否为零,但它从未发生过。

这就是我所拥有的

if((ret == pselect(..., timeout, NULL) <0 ){
//check errors
} else if (ret == 0)
{
//close connection for timing out
//I never land here, even though I can close the client side (thus presumably closing the connection)
}

如果这是我的问题,我还能做些什么来调试?虽然我可以在 sockstat 中看到它们,但我很难准确判断哪些套接字 fd 处于打开状态。

【问题讨论】:

    标签: c sockets select freebsd


    【解决方案1】:

    您的线程可能在(不包括)else 情况下旋转,因为从另一端关闭的套接字既可读又可写。要进入超时情况,您需要在超时期间保持另一端打开。

    (在poll() 术语中,您所在的情况是POLLHUP)

    【讨论】:

    • 我明白了...我会试一试..我确实有一些其他块来检查集合中的 fd,但我不认为我只是有一个包罗万象否则
    • @Derek:你不需要一个包罗万象的else,只是在你展示的其他子句中,你会看到一个远程关闭的套接字在读取集中,@987654325 @ 将返回 ECONNRESET。
    • 如果对端正常断开连接,它将返回零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2011-01-26
    • 1970-01-01
    • 2011-10-10
    • 2015-12-07
    • 2016-09-22
    • 2015-09-04
    相关资源
    最近更新 更多