TCP套接字永远不会关闭

时间:2013-01-19 00:38:46

标签: c sockets select freebsd

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

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

在psuedo中,这就是我所拥有的

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正在打开。

1 个答案:

答案 0 :(得分:2)

您的线程可能在(未包含)else情况下旋转,因为从另一端关闭的套接字是可读写的。为了进入超时情况,您希望在超时时间内保持另一端打开。

(您所在的案例POLLHUP poll()