TCP - это поток байтов, он ничего не знает о сообщениях, строках или о чем-либо подобном. Когда вы отправляете данные по TCP, все, что он знает, это необработанные байты, а не то, что представляют байты. Вы несете ответственность за реализацию протокола обмена сообщениями поверх TCP, чтобы каким-либо значимым образом разграничить данные, чтобы получатель мог знать, когда данные завершены. Есть два способа сделать это:
отправить длину данных перед отправкой фактических данных. Получатель сначала читает длину, а затем читает, сколько байтов говорит длина.
отправляет уникальный терминатор после отправки данных. Убедитесь, что терминатор никогда не появляется в данных. Затем получатель может читать, пока не получен терминатор.
Вы не обрабатываете ни один из них в вашем recv()
коде, поэтому я подозреваю, что вы не обрабатываете ни один из них в вашем *Код 1014 * тоже (который вы не показывали).
Поскольку вы отправляете текстовый файл, вы можете:
отправить размер файла, например:в uint32_t
или uint64_t
(в зависимости от размера файла), затем отправьте необработанные байты файла.
отправьте каждую текстовую строку отдельно как есть, завершаетсяCRLF
или bare-LF
разрыв строки после каждой строки, а затем отправка последнего терминатора после последней строки.
Вы также игнорируете возвращаемое значение recv()
, которое сообщаетВы, сколько байтов было фактически получено. Он может и обычно возвращает меньше байтов, чем запрошено, поэтому вы должны быть готовы к многократному вызову recv()
, обычно в цикле, для полного получения данных. То же самое с send()
.