【发布时间】:2016-02-23 09:41:46
【问题描述】:
我在阻塞套接字上执行select(),没有超时select(sock+1, &rfd, NULL, NULL, NULL)。
这发生在一个目标是分派传入数据的线程中。另一个监视线程正在管理与对等方的保持活动状态,当它检测到死连接时,它将关闭套接字。
我期待select() 在这种情况下返回-1。它在 Windows 上执行此操作,但在 Linux 上从不执行此操作,因此当对等方非正常消失时,调度线程将永远锁定。为了完整起见,有待传输的数据,我尝试使用SO_LINGER,但这并没有改变任何东西。
问题可以通过在select() 中设置超时来解决,在这种情况下,在关闭和超时后,select() 最终会以-1 退出,但我认为,阅读文档时,select() 没有超时即使对等方没有响应,仍会在关闭时退出。
我是误用了select() 还是有更好的方法来处理半开套接字?
【问题讨论】: