возник вопрос, написал я такой себе сервер. Если я запрашиваю картинку, то получаю следующее: Чтение для открытия HTML страниц вопросов не вызывает:
С помощью этого кода я читаю файл:
ifstream f(text);
if (f.good())
{
string str((istreambuf_iterator<char>(f)), istreambuf_iterator<char>());
answer = str;
code = 200;
}
f.close();
И отправляю ответ клиенту:
ostringstream response << "HTTP/1.1 " << code << " OK\r\n" // code - 200 или 404
<< "Version: HTTP / 1.1\r\n"
<< "Content-Type: " << s // запрашиваемый файл
<< "Content-Length: " << answer.length() // длина строки
<< "\r\n\r\n"
<< answer; // строка для чтения
send(client_socket, response.str().c_str(), response.str().length(), 0);
В случае отправки картинки:
s = "image/jpeg;\r\n";
Как мне прочитать картинку и записать в строку? Или лучше отвечать html страничкой (к которой прикреплен файл)? Спасибо!)
Вы пытаетесь с бинарным файлом (png) обращаться так же, как и с символьной строкой. Однако в строке байт 0 является завершающим символом, а файле png нулевые байты идут начиная с позиции 8. Соответственно у вас передаются только первые 8 байт, а это ‰PNG плюс пара переводов строки. Что мы и наблюдаем на ваших скриншотах. Решение: вместо строки использовать массив байт, в котором 0 не рассматривается как ограничитель.
ДОПОЛНЕНИЕ
Пример программы, которая читает в массив некий png (просто читает и все):
#include <iostream>
#include <fstream>
#include <filesystem>
#include <vector>
using namespace std;
int main() {
const filesystem::path fileName = LR"(C:\Temp\cmmentics.png)";
auto fileSize = filesystem::file_size(fileName);
vector<char> fileBuffer(fileSize);
ifstream is(fileName, ios::binary);
is.read(fileBuffer.data(), fileSize);
return 0;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей