Я попытался реализовать команду 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 символа за раз. Итак, в первом цикле будет получено «это», во втором - «есть» и так далее. Как я могу просто поместить всю строку в буфер приема и прервать ее, если в файле, из которого она читается, больше нет текста?
Что находится в receive_buffer, когда вы измеряете его длину с помощью strlen?
Вы должны опубликовать объявления всех используемых вами переменных.
его длина 44.
@RyanThompson strlen не сообщает вам размер буфера, он сообщает вам длину строки внутри буфера. Он в основном считает символы, пока не найдет нулевой терминатор (символ нулевого значения).





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