Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C比Python更可靠吗? 我在Python中尝试的内容_Python_Python 3.x_Network Programming - Fatal编程技术网

C比Python更可靠吗? 我在Python中尝试的内容

C比Python更可靠吗? 我在Python中尝试的内容,python,python-3.x,network-programming,Python,Python 3.x,Network Programming,我试图在python(3.6)中通过TCP连接复制一个大文件。我有两个函数:send_chunk(发送一个小标题,然后发送一些数据)和recv_chunk(解析该标题,返回数据)。我将要发送的文件分割成若干块,并尽可能快地将它们放到网络上。直到4-5MB左右,一切正常。然后,recv_chunk接收到一些不正确的数据,一切都结束了 什么在C中工作 C语言中的相同操作(由netcat演示)在发送100MB文件时不会出现任何错误(CPU使用率也大大降低)。我查看了netcat代码,只看到了普通的se

我试图在python(3.6)中通过TCP连接复制一个大文件。我有两个函数:send_chunk(发送一个小标题,然后发送一些数据)和recv_chunk(解析该标题,返回数据)。我将要发送的文件分割成若干块,并尽可能快地将它们放到网络上。直到4-5MB左右,一切正常。然后,recv_chunk接收到一些不正确的数据,一切都结束了

什么在C中工作 C语言中的相同操作(由netcat演示)在发送100MB文件时不会出现任何错误(CPU使用率也大大降低)。我查看了netcat代码,只看到了普通的select和read/write调用

当前问题: 出了什么问题?为什么它在C语言中看起来如此简单,但在python中却不起作用

代码,供参考:
def发送块(数据,sock):
如果类型(数据)为str:
数据=字节(数据“utf8”)
len_str=“{}”。格式(len(数据))
len_str_size=chr(len(len_str))
发送数据=字节(len_str_size+len_str,'ascii')+数据
发送的总数=0
总长度=长度(发送数据)
发送的总长度<总长度:
发送数据=sock.send(发送数据[发送总数:)
打印(“%f”发送%d“%”(时间(),总长度))
如果发送的数据<总长度:
打印('仅发送%d'%1!''数据\u已发送,刷新=True)
发送的总数+=发送的数据
def recv_块(sock):
有效载荷_数据=b';大小=0
len_数据=b';透镜尺寸=0
#获取长度字段大小
len_size=ord(袜子收纳(1))
#获取长度字段
而len(len_数据)
您的代码适合我,但多次复制数据会使速度变慢。 只需使用
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)
def发送块(数据,sock):
如果存在(数据,str):
数据=字节(数据“utf8”)
sendall(len(data).to_字节(4,'little'))
sock.sendall(数据)
def recv_块(sock):
尺寸=b“”
而透镜(尺寸)<4:
尺寸+=袜子尺寸(4-len(尺寸))
bytes_left=int.from_字节(大小为'little')
#获取数据
数据=[]
当你离开时:
d=sock.recv(剩余字节)
数据追加(d)
字节\u左-=len(d)
返回b“”。加入(数据)
sendall()对我们不起作用;大文件传输时出错速度更快。您是通过internet还是通过环回接口进行测试?
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)