当前位置: 代码迷 >> python >> C比Python更可靠地联网吗? 我在Python中尝试的 什么在C中起作用 每日问题:
  详细解决方案

C比Python更可靠地联网吗? 我在Python中尝试的 什么在C中起作用 每日问题:

热度:101   发布时间:2023-06-13 14:26:23.0

我在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

您的代码对我有用,但是多次复制数据会使速度变慢。 只需使用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)