C比Python更可靠的网络?

时间:2017-02-09 18:59:56

标签: python python-3.x network-programming

我在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 个答案:

答案 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)
相关问题