Я пытаюсь написать безопасную программу для передачи файлов с использованием Python и AES, и у меня возникла проблема, которую я до конца не понимаю.Я отправляю свой файл, анализируя его с помощью фрагментов размером 1024 байта и отправляя их поверх, но серверная сторона, получающая данные, вылетает (я использую AES CBC, поэтому моя длина данных должна быть кратна 16 байтам), и полученная ошибка говорит, что этоnot.
Я попытался напечатать длину данных, отправленных клиентом на стороне клиента, и длину данных, полученных на сервере, и это показывает, что клиент отправляет ровно 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
Благодаря Faisal мой код здесь:
Сторона сервера: (count - это мой размер файла / 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