python - recv() 不断返回相同的数据

标签 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() 的非常奇怪的行为。 也许这不是从套接字接收所有数据的最佳方式,但我想不出对此行为的任何解释。

最佳答案

以下几行:

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

应该改变:

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

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

关于python - recv() 不断返回相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24623749/

相关文章:

python - python 中空白/标点符号的小问题?

python - 如何将对象转换为数组

python - 使用 Keras 的不平衡数据集

django - nginx,uwsgi,DJango,DEBUG = False时的502, “upstream prematurely closed connection”

html - 如何使选择的输入在所有平台的所有浏览器中看起来都一样?

MySQL按小时获取记录数,即使是没有记录的小时

python - 是否可以使 `type` 的输出返回不同的类?

python - ssl.SSLError : [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed, Python 套接字、ssl、gmail smtp 连接

c - C 中的套接字 : Proper way to close socket

select - Sublime text 2 - 列选择直到行尾