TCP套接字文件传输

2024-04-24 07:18:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python和AES编写一个安全传输文件程序,但我有一个问题我不完全理解。我通过用1024字节的块解析文件并发送它们来发送我的文件,但是接收数据的服务器端崩溃了(我使用AES CBC,因此我的数据长度必须是16字节的倍数),得到的错误告诉我它不是。

我试着打印客户端发送的数据的长度和服务器端接收的数据的长度,结果显示客户端每次发送的数据正好是1024字节,而服务器端显示在某个时间点,接收到的数据包不小于1024字节(例如743字节)。

我试着安排一个时间,在客户端的每个socket发送之间睡眠(0.5),这似乎是可行的。是否可能是服务器端的某种套接字缓冲区故障?客户端发送的数据太多太快,并且它以某种方式破坏了服务器端的套接字缓冲区,因此数据被破坏或消失,recv(1024)只接收到一个断块?这是我唯一能想到的,但这也可能是完全错误的,如果有人知道这为什么不能正常工作,那就太好了;)

按照我的想法,我试着:

    self.s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 32768000)
    print socket.SO_RCVBUF

我试着在服务器端放一个32mbytes的缓冲区,但是在Windows XP上显示4098,在linux上显示只有8。我不知道该如何解释,我只知道它似乎没有32mbytes的缓冲区,所以代码不起作用。

好吧,这是一个很长的帖子,我希望你们中的一些人有勇气读到这里!我完全迷路了,所以如果有人知道这件事,请与我分享:D

多亏费萨尔,我的密码在这里:

服务器端:(count是我的文件大小/1024)

while 1:
    txt=self.s.recv(1024)
    if txt == " ":
        break       
    txt = self.cipher.decrypt(txt)
    if countbis == count:
        txt = txt.rstrip()
    tfile.write(txt)
    countbis+=1

客户端:

while 1:
    txt= tfile.read(1024)
    if not txt:
        self.s.send(" ")
        break
    txt += ' ' * (-len(txt) % 16)
    txt = self.cipher.encrypt(txt)
    self.s.send(txt)

提前谢谢你

诺尔希安


Tags: 文件数据selftxt客户端if字节so
3条回答

TCP是一种流协议,它并不像您刚刚发现的那样保留消息边界。

欢迎收看网络节目!您刚刚陷入了同样的错误假设中,即每个人在假设客户机发送和服务器接收应该是对称的情况下都会第一次通过。不幸的是,事实并非如此。操作系统允许接收以任意大小的块发生。不过,处理起来相当容易,只需缓冲数据,直到读入的数据量等于希望接收的数据量。一些类似的事情可以做到:

buff=''
while len(buff) < 1024:
    buff += s.recv( 1024 - len(buff) )

正如其他人指出的,您可能正在处理一个不完整的消息。您需要有固定大小的消息或有一个分隔符(不要忘记转义您的数据!)所以你知道什么时候收到完整的信息。

相关问题 更多 >