recv() 一直返回相同的数据
我正在做一个简单的异步HTTP代理。
我写了一个函数来接收所有数据(因为我不知道接收到的数据具体有多大):
def recvall(sock):
data = b""
while True:
r, w, e = select.select([sock], [], [], 1)
if r:
data+= sock.recv(65535)
if not data: # if empty
break
else:
break
return data
这段代码运行得很好,但在我的测试中,我发现这个循环永远不会结束,一直在重复接收相同的数据(具体来说,就是“301 永久移动...”)。
这种行为让我觉得很奇怪,recv()函数怎么会这样。
可能这不是从套接字接收所有数据的最佳方式,但我想不出任何解释来说明这种行为。
1 个回答
2
下面的代码:
data += sock.recv(65535)
if not data: # if empty
break
应该改成:
chunk = sock.recv(65535)
if not chunk:
break
data += chunk
否则,它会检查已经累积的数据,而不是刚刚收到的数据;如果有数据被接收,就会导致无限循环。