recv()继续返回相同的数据

时间:2014-07-08 04:30:37

标签: python sockets select python-3.x 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 个答案:

答案 0 :(得分:2)

以下行:

data += sock.recv(65535)
if not data: # if empty
    break 

应该改变:

chunk = sock.recv(65535)
if not chunk:
    break
data += chunk

否则它将检查累积的数据,而不是刚收到的数据;如果收到任何数据,会导致无限循环。