问题描述
我在Python中尝试的
我正在尝试通过python(3.6)中的TCP连接复制一个大文件。 我有两个函数:send_chunk(发送一个小头,然后发送一些数据)和recv_chunk(解析该头,返回数据)。 我将要发送的文件分成多个块,并以允许的最快速度将它们放在网络上。 直到大约4-5 MB,一切正常。 然后,recv_chunk接收到一些不正确的数据,并且一切都变得很顺利。
什么在C中起作用
在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
1楼
您的代码对我有用,但是多次复制数据会使速度变慢。
只需使用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)