socket.recv() 接收的字节数少于预期

开发人员

此代码下载大部分文件但不是所有文件(在while循环内)知道我做错了什么吗?

data = csocket.recv(1024)
with open(filename, 'wb') as file_to_save:
    while data:
      file_to_save.write(data)
      time.sleep(.008)
      data = csocket.recv(1024)
      if len(data) < 1024:
         break

下载 38,616 字节大小的文件时,此代码下载大约 600 字节短。

标准

通常 recv() 函数不保证返回您“请求”的总字节数。该参数只是您希望接收的最大字节数,但如果缓冲区中可用,该函数可以返回比这更少的字节。这是来自https://docs.python.org/3/howto/sockets.html的实现

    def myreceive(self):
        chunks = []
        bytes_recd = 0
        while bytes_recd < MSGLEN:
            chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))
            if chunk == b'':
                raise RuntimeError("socket connection broken")
            chunks.append(chunk)
            bytes_recd = bytes_recd + len(chunk)
        return b''.join(chunks)

如您所见,该函数重复 recv() 直到预期的字节数到达。每个块到达后,新的 recv() 请求最大字节数MSGLEN – bytes_recdmin() 用于限制每个块的接收字节数为 2048。当 recv() 函数返回 0 字节(chunk == b'')时,表示对方关闭了连接。

对于您的情况,len(data)can a 有时会返回小于 1024。您的中断条件应该是if len(data) < 1:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章