Веб-сервер на C ++, как отправить изображение - PullRequest
1 голос
/ 09 ноября 2010

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

Вот что у меня есть.Я знаю, что отправка одного байта за раз неэффективна, но это было для тестирования.

char buffer[1];
send_header(new_fd, get_file_type(file_location));
ifstream file;
file.open(temp.c_str(), ios::out | ios::binary);
while (file.good())
{
    file.read(buffer, sizeof(buffer));
 send(new_fd, buffer, strlen(buffer), 0);
}

Есть идеи?Нужно ли преобразовывать его в сетевой порядок байтов перед отправкой?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 09 ноября 2010

@ cdhowie прав примерно на strlen() как виновник. Однако, если вы действительно хотите быть «современным», подумайте об использовании <a href="http://linux.die.net/man/2/sendfile" rel="nofollow">sendfile()</a>. Это будет <a href="http://linux.die.net/man/2/mmap" rel="nofollow">mmap()</a> файл, который вы хотите отправить для вас.

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

6 голосов
/ 09 ноября 2010

strlen(buffer) будет отсчитывать до первого нулевого символа ('\0'), который является очень распространенным байтом в данных изображения. Вместо этого вам необходимо выяснить, сколько фактически было прочитано байтов (ifstream.read() не предоставляет эту информацию) и использовать ее вместо вашего strlen вызова.

РЕДАКТИРОВАТЬ: Вы можете получить это с ifstream.gcount() - просто замените ваш strlen вызов на file.gcount(), и все должно работать волшебным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...