Отправка файлов с сокетами - PullRequest
1 голос
/ 16 мая 2011

Я пытаюсь создать простой HTTP-сервер, чтобы узнать больше о том, как он работает. У меня проблемы с отправкой двоичных файлов клиенту. Мой код, как показано ниже:

char * buffer = (char *)malloc(sizeof(char) * 512);
fseek(content_file, 0, SEEK_SET);
while (!feof(content_file)) {
    size_t read = fread(buffer, sizeof(char), sizeof(buffer), content_file);
    if (read > 0) {
        client->send((const void *)buffer);
    }
}
fclose(content_file);
free(buffer);

Теперь я знаю, что он может посылать некоторые ненужные данные после последнего чтения блока, но прежде чем пытаться это исправить, я хочу узнать, что с ним не так. Это работало нормально для текстовых файлов, и я использовал fgets. Но после переключения на fread для поддержки двоичных файлов текстовые файлы повреждаются и становятся примерно такими: ThisÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ («Это» - единственная правильная часть в отправляемых данных)

Очевидно, я что-то упустил, но не могли бы вы помочь мне сделать это правильно?

Edit:

Использование значения buffer_size вместо sizeof(buffer) решило проблему отсутствия / повреждения данных.

1 Ответ

4 голосов
/ 16 мая 2011

Ваша проблема в том, что sizeof(buffer) дает вам размер указателя, а не то, на что он указывает.

Добавьте buffer_size и используйте это как для malloc, так и для freed.

...