我想写一个安全的传输文件程序使用Python和AES,我有一个问题,我不完全明白。我通过使用1024字节的块来解析文件并发送它们,但接收数据的服务器端发生崩溃(我使用AES CBC,因此我的数据长度必须是16字节的倍数),并且我得到的错误表示它是不。TCP套接字文件传输
我试图打印客户端发送的数据的长度和客户端接收到的数据的长度,它表明客户端每次发送的时间恰好是它应该发送的1024字节,但是服务器端显示在某个时间点接收到的数据包不是并且小于1024字节(例如743字节)。
我试图把客户端发送每个套接字之间的time.sleep(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
感谢费萨尔我的代码是在这里:
服务器端:(计数是我的文件大小/ 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)
由于提前,
Nolhian
如果您将代码发布到recv()调用的周围,那么找出错误会更容易一些。假设你每次传输调用一次recv(),你应该知道你不能期望在一次调用recv()的时候获得你发送的所有数据的1024个字节。您需要循环调用recv()并连接到缓冲区,直到您收到您期望的1024个字节。 – Faisal 2010-07-06 20:19:56