我试图在python(3.6)中通过TCP连接复制一个大文件。我有两个函数:send_chunk(发送一个小头,然后是一些数据)和recv_chunk(解析那个头,返回数据)。我将文件分割成我发送到块中的文件,然后尽可能快地将它们放到网络上。直到大约4-5 MB,一切正常。然后,recv_chunk收到一些不正确的数据,一切都是吐司。
C中的相同操作(如netcat所示)在发送没有错误的100MB文件(CPU使用率也低得多)方面没有问题。我查看了netcat代码,我只看到了正常的select和read / write调用。
可能出现什么问题?为什么它在C中看起来如此简单,但它在python中不起作用?
def send_chunk(data, sock):
if type(data) is str:
data = bytes(data, 'utf8')
len_str = "{}".format(len(data))
len_str_size = chr(len(len_str))
send_data = bytes(len_str_size+len_str, 'ascii')+data
total_sent = 0
total_len = len(send_data)
while total_sent < total_len:
data_sent = sock.send(send_data[total_sent:])
print('%f sending %d'%(time(),total_len))
if data_sent < total_len:
print('only sent %d'%data_sent,flush=True)
total_sent += data_sent
def recv_chunk(sock):
payload_data = b''; size = 0
len_data = b''; len_size = 0
# get the length field size
len_size = ord(sock.recv(1))
# get the length field
while len(len_data) < len_size:
len_data += sock.recv(len_size-len(len_data))
size = int(len_data)
# get the data
while len(payload_data) < size:
payload_data += sock.recv(min(size-len(payload_data), 2048))
return payload_data
答案 0 :(得分:0)
您的代码适用于我,但多次复制数据会使这种情况变得缓慢。
只需使用sendall
:
def send_chunk(data, sock):
if isinstance(data, str):
data = bytes(data, 'utf8')
sock.sendall(len(data).to_bytes(4, 'little'))
sock.sendall(data)
def recv_chunk(sock):
size = b""
while len(size) < 4:
size += sock.recv(4-len(size))
bytes_left = int.from_bytes(size, 'little')
# get the data
data = []
while bytes_left:
d = sock.recv(bytes_left)
data.append(d)
bytes_left -= len(d)
return b''.join(data)