我正在尝试使用 Python 和 AES 编写一个安全的传输文件程序,但我遇到了一个我不完全理解的问题。我通过用 1024 字节块解析文件并将它们发送过来来发送我的文件,但是接收数据的服务器端崩溃(我使用 AES CBC,因此我的数据长度必须是 16 字节的倍数)并且我得到的错误是不是。
我试图在客户端打印客户端发送的数据的长度以及在服务器上接收到的数据的长度,它表明客户端每次都像预期的那样发送准确的 1024 字节,但服务器端显示在某个时间点,收到的数据包不小于 1024 字节(例如 743 字节)。
我试图在客户端的每个套接字发送之间放置一个 time.sleep(0.5) ,它似乎工作。是否有可能是服务器端的某种套接字缓冲区故障?客户端发送的数据太快,并且它以某种方式破坏了服务器端的套接字缓冲区,因此数据已损坏或消失,并且 recv(1024) 仅收到损坏的块?这是我唯一能想到的,但这也可能是完全错误的,如果有人知道为什么它不能正常工作,那就太好了;)
按照我的想法,我尝试了:
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 32768000)
print socket.SO_RCVBUF
我试图在服务器端放置一个 32 兆字节的缓冲区,但在 Windows XP 上它在打印上显示 4098,而在 linux 上它只显示 8。我不知道我必须如何解释这一点,我唯一知道的是它似乎它没有 32mbytes 的缓冲区,因此代码不起作用。
这篇文章真的很长,我希望你们中的一些人有勇气把它全部读到这里!我完全迷路了,所以如果有人对此有任何想法,请分享:D
感谢费萨尔,我的代码在这里:
服务器端:(计数是我的文件大小/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)
提前致谢,
诺利安