我正在使用 gevent 修补套接字连接到流式服务器,并且正在使用 adsl 连接。
我不控制服务器,但在我的测试中,如果我停止服务器,我可以通过检查 recv 的结果是否为空字符串来检测断开连接,但如果我关闭我的 adsl 调制解调器 recv 永远不会退出。如果我只是断开计算机的网络电缆,它也不会返回空字符串,但是当我重新连接它时,它会返回服务器同时发送的所有内容,所以我猜路由器或调制解调器正在为我保持连接打开并在我的网络电缆断开连接时缓冲流。
我尝试将 socket.SO_RCVTIMEO 设置为几秒钟,但它没有检测到断开连接,recv 继续永远“阻塞”。这是gevent,所以它只会阻塞greenthread,但我需要尽快检测到这种断开连接,以便我可以尝试重新连接。