Как отправить двоичный файл в сегментах по сети в C? - PullRequest
0 голосов
/ 17 ноября 2011

Я немного озадачен тем, как отправить файл с http-сервера на клиент (веб-браузер).

Сначала я отправляю заголовок, и моя следующая задача - отправить содержимое файла.Однако я хочу отправить его по 512 байтам вместо целого файла сразу, так как столкнулся с некоторыми проблемами.

Я немного растерялся, как этого добиться.Вот что я хочу

read file1;
while (seg=get_next_segment(file1)){
  do
    send(seg)
  until (seg_is_sent)
}

Однако я не могу найти соответствующие функции для достижения этой цели.fread и fseek приходили мне в голову, но первый читает весь файл сразу, а с помощью fseek я не вижу способа просто извлечь часть из файла (вместо чтения из указателя файла до концафайла).

Ответы [ 3 ]

3 голосов
/ 17 ноября 2011

fread не читает весь файл до конца.Он точно читает, сколько вы говорите ему прочитать.

size_t
 fread(void *restrict ptr, size_t size, size_t nitems,
     FILE *restrict stream);

 size_t
 fwrite(const void *restrict ptr, size_t size, size_t nitems,
     FILE *restrict stream);

Обе функции имеют размер и nitems.Вы можете установить размер 512, а количество элементов - 1 (или наоборот) и прочитать только эту часть файла.

2 голосов
/ 17 ноября 2011

Со страницы руководства:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

Функция fread() читает nmemb элементов данных, каждый размер байтов длиной от потока, на который указывает stream , сохраняя их в месте, указанном ptr .

Как видите, вы неЧтобы прочитать весь файл с помощью fread, вы можете прочитать его в виде фрагментов nmemb .

Если вы пишете свой собственный веб-сервер на C, вы можете захотеть иметьвзгляните на libmicrohttpd , веб-сервер на C для встраивания в другие приложения, он может обрабатывать потоковые файлы для вас.

1 голос
/ 17 ноября 2011

Я чувствую себя хорошо ... Как насчет чего-то вроде этого:

for (;;)
{
    char buffer[512];
    size_t nread = fread(buffer, sizeof(char), 512, fp);
    if (nread > 0)
        send_to_socket(buffer, nread);

    if (nread < 512)
    {
        if (feof(fp))
            printf("End of file\n");
        if (ferror(fp))
            printf("Error reading\n");
        break;
    }
}
...