TCP 套接字永远不会关闭

问题描述 投票:0回答:1

我有一个正在运行的

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 freebsd posix-select
1个回答
2
投票

您的线程可能在(不包括)

else
情况下旋转,因为从另一端关闭的套接字既可读又可写。要进入超时情况,您需要在超时时间内保持另一端打开。

(您所处的情况是

POLLHUP
,用
poll()
术语来说)

© www.soinside.com 2019 - 2024. All rights reserved.