TCP - это протокол потоковой передачи байтов.Вы гарантированно получите байты в том же порядке, но не в том же размере, что и отправленные.Используйте (или разработайте) протокол более высокого уровня (HTTP и т. Д.), Чтобы обеспечить получение всех отправленных байтов.
Например, первые отправленные байты могут быть именем файла с нулевым символом в конце, за которым следует размер файлав виде строки с нулевым символом в конце, за которой следует содержимое файла.При принятии соединения приемник буферизует s.recv(1024)
, вызывает и извлекает имя файла и размер файла, заканчивающиеся нулевыми значениями, а затем продолжает чтение, пока буфер не содержит как минимум байтов "размера файла".
Другой вариант заключается впросто передайте файл и закройте соединение, получатель буферизует все полученное, пока recv()
не вернет ноль байтов, указывая на то, что соединение было закрыто.
Первый вариант позволяет отправлять несколько файлов без закрытия соединения.