【发布时间】:2019-09-13 12:08:43
【问题描述】:
上下文:
二进制协议定义给定大小的帧是很常见的。 struct 模块擅长解析它,前提是所有内容都已在单个缓冲区中接收。
问题:
TCP 套接字是流。从套接字读取不能提供比请求更多的字节,但可以返回更少。所以这段代码不可靠:
def readnbytes(sock, n):
return sock.recv(n) # can return less than n bytes
天真的解决方法:
def readnbytes(sock, n):
buff = b''
while n > 0:
b = sock.recv(n)
buff += b
if len(b) == 0:
raise EOFError # peer socket has received a SH_WR shutdown
n -= len(b)
return buff
可能效率不高,因为如果我们要求大量的字节,并且数据如果非常碎片化,我们会反复重新分配一个新的字节缓冲区。
问题:
如何才能可靠地从流套接字准确接收 n 个字节而没有重新分配的风险?
参考资料:
那些其他问题是相关的,确实给出了提示,但没有一个给出简单明了的答案:
【问题讨论】:
-
另请参阅此答案:stackoverflow.com/a/15964489