最近在做socket编程的作业,遇到一个问题纠缠了我十几个宝贵的小时
在使用socket收发长达1MB的文件分块时,会莫名出现recv收到的文件长度并不是我send的文件长度,即使在我提前send了接下来要发送的字符长度,并设置recv需要接收的字符长度的情况下依然不能正确收发,会出现收到的字符串过短和超长的奇奇怪怪的bug
最后,在请教chatGPT之后,怀疑是recv没能完整的接收客户端/服务端send的全部字符,遂对recv进行了如下的调整,循环接收缓冲区的内容
def recvall(sock, n):
# 用于接收完全的数据
data = bytearray()
while len(data) < n:
packet = sock.recv(n - len(data))
if not packet:
return None
data.extend(packet)
return data
chunk_data_raw = recvall(s, chunk_length) #chunk_length是字符长度
if chunk_data_raw is not None:
chunk = chunk_data_raw.decode()
进行如上的调整后,每次指定长度的字符都能被正常接收。
应该是recv缓冲区的问题,但本人第一次有这么大文本传输的需求,也是第一次碰到这个问题,有没有糕手为小弟解释一下原因