Как получить полный текст в текстовом файле на сервер в c?

Я попытался реализовать команду STOR с текстовыми файлами. На сервере у меня есть код, который получает файлы в виде строки в receive_buffer. Есть ли способ получить строку целиком в буфер?

            while (true)
            {
                if (active == 0) 
                {
                    bytes = recv(ns_data, receive_buffer, strlen(receive_buffer), 0);
                }
                else
                {
                    recv(s_data_act, receive_buffer, strlen(receive_buffer), 0);
                    printf("len: %d\n", strlen(receive_buffer));
                    printf("receive_buffer: %s\n", receive_buffer);
                }


                printf("Receive_buffer: %s\n", receive_buffer);

                strcpy(temp_buffer, receive_buffer);
                printf("temp_buffer: %s\n", temp_buffer);
                fputs(temp_buffer2, f);

На данный момент, скажем, например, есть текстовый файл с именем text.txt и образец текста в графе «это слово», функция recv получает только 4 символа за раз. Итак, в первом цикле будет получено «это», во втором - «есть» и так далее. Как я могу просто поместить всю строку в буфер приема и прервать ее, если в файле, из которого она читается, больше нет текста?

Почему вы получаете только 4 штуки за раз? Если ваш буфер приема имеет длину всего 4 байта, я бы рекомендовал сделать его длиннее.

sudo 17.04.2018 02:46

Что находится в receive_buffer, когда вы измеряете его длину с помощью strlen?

Galik 17.04.2018 02:48

Вы должны опубликовать объявления всех используемых вами переменных.

Galik 17.04.2018 02:49

его длина 44.

Ryan Thompson 17.04.2018 07:17

@RyanThompson strlen не сообщает вам размер буфера, он сообщает вам длину строки внутри буфера. Он в основном считает символы, пока не найдет нулевой терминатор (символ нулевого значения).

Galik 18.04.2018 20:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
59
1

Ответы 1

recv в том виде, в котором вы его используете, будет читать до тех пор, пока в буфере сокета больше не останется данных или ваш буфер приема не заполнится, вызывая поведение, которое вы видите. Невозможно узнать, когда файл будет получен, если вы не встроите это в свой протокол.

Если файл является только текстовым, вы можете завершить сообщения байтом 0 (\0) и повторно вызывать recv, пока не увидите, что это прибыло (поскольку \0 не будет ни в одном текстовом файле). Или вы можете добавлять ко всем передачам специальный заголовок, указывающий длину. Оба способа небезопасны, если вы не будете очень осторожны.

Другие вопросы по теме