
网上查找都是说 recv 为空代表对等方已经关闭了连接,但事实上并没有关闭?我依然可以接收到新的数据,也可以发送。
https://stackoverflow.com/questions/3091010/recv-socket-function-returning-data-with-length-as-0
并且同样的代码在 linux 下就很正常,这个情况只在 Windows 下复现。并且非常神奇,socket 刚创建没问题,10 分钟后(一秒不差)就出现 recv 空数据
我的 Python 版本为 3.8
格式乱了。。。 出现这个问题之后,双方都能够正常收发。不过目前这个服务端不是我这边的,所以我就先只贴一下客户端代码
class Recv(threading.Thread): def __init__(self, s, stop_event=None): super(Recv, self).__init__() self.setDaemon(True) self.q = queue.Queue() self.s = s # socket self.stop_event = stop_event if stop_event else threading.Event() def run(self): while not self.stop_event.is_set(): try: data = self.s.recv(131072) if len(data) != 0: self.q.put(data) except (ConnectionResetError, OSError, ConnectionAbortedError) as e: logging.error('recv', str(e)) 1 dingwen07 2021-10-12 02:53:46 +08:00 via iPhone 我没有遇到过 不过我没试过 10 分钟的,之后试一下 |
2 jedihy 2021-10-12 03:29:59 +08:00 单步进去看看这个 0 是不是 winsock 的 recv()返回的。如果是,并且你还能收到新数据,那可能是 OS 的 bug 。不然可能是 python 的 bug 。 |
3 lzp729 2021-10-12 05:52:01 +08:00 via iPhone 超时了 |
4 skinny 2021-10-12 09:13:20 +08:00 问得没头没尾的,你代码怎么写的? |
5 est 2021-10-12 09:40:59 +08:00 > 我依然可以接收到新的数据,也可以发送。 不代表连接没关闭。。。。 你发送,对方可以不收。。并且对方再通知你,不要联系了。 |
6 makelove 2021-10-12 10:48:00 +08:00 这种不应该贴一下最小复现代码吗 |
7 dreamtrail 2021-10-12 11:40:44 +08:00 也许是系统或者 python 有 bug,但这种可能性挺小的 |
8 muzuiget 2021-10-12 12:36:14 +08:00 只是缓冲区没有数据而已,返回负数才是错误啊,比如连接关闭,再 recv 多几次就应该出现负数了。 |
9 muzuiget 2021-10-12 12:37:35 +08:00 晕,原来是 Python,但是你贴的爆栈帖子说的是 C,两者语义未必一直,还是看 Python 文档好了。 |
11 Shatyuka 2021-10-13 01:05:25 +08:00 via Android 长连接 keepalive |