我正在使用gevent修补的socket连接到一个流媒体服务器,我的连接方式是ADSL。
虽然我无法控制服务器,但在我的测试中,如果停止服务器,只需检查recv返回结果是否为空字符串即可检测到断开连接的情况。但是,如果关闭我的adsl调制解调器,recv永远不会退出。如果仅仅是拔下电脑的网络电缆,它也不会返回空字符串,当我重新连接时,它会返回期间服务器发送的所有内容,因此我猜想路由器或调制解调器为我保持连接,并在我的网络电缆断开时缓冲流。
我尝试将socket.SO_RCVTIMEO设置为几秒钟,但它并没有检测到断开连接,recv仍然“阻塞”了很长时间。由于这是基于gevent的应用程序,因此仅会阻塞greenthread,但我需要尽快检测到此断开连接情况,以便尝试重新连接。