Я пытаюсь написать безопасную программу передачи файлов с использованием 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
Я попытался установить буфер на 32 мегабайта на стороне сервера, но в Windows XP он отображает 4098 на печать, а на Linux - только 8. Я не знаю, как я должен это интерпретировать, единственное, что я знаю, это то, что он кажется, что у него нет буфера 32 мегабайта, поэтому код не работает.
Ну, это был очень длинный пост, я надеюсь, что у некоторых из вас хватило смелости прочитать все это здесь! Я полностью потерял там, так что если у кого есть какие-либо идеи по этому поводу, пожалуйста, поделитесь им: 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() один раз за передачу, вы должны знать, что вы не можете ожидать получить все 1024 байта ваших отправленных данных за один вызов recv(); вам нужно зациклиться на вызове recv() и конкатенации в буфер до тех пор, пока вы не получите 1024 байта, которые вы ожидали. – Faisal