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
サーバー側に 32mbytes のバッファを配置しようとしましたが、Windows XP ではプリントに 4098 が表示され、Linux では 8 しか表示されません。これをどのように解釈する必要があるのか わかりません。 32 メガバイトのバッファがないため、コードは機能しません。
かなり長い投稿になってしまいましたが、勇気を出してここまで読んでくださった方がいらっしゃれば幸いです。私はそこで完全に迷っているので、誰かがこれについて何か考えを持っているなら、それを共有してください:D
Faisal のおかげで、私のコードは次のとおりです。
サーバー側: (カウントは私のファイルサイズ/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)
前もって感謝します、
ノリアン