我想寫一個安全的傳輸文件程序使用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