Обслуживание изображений на сервере C ++

У меня есть сервер Linux C ++, с базовыми серверными сокетами. Вот что я использую для сервера изображений PNG:

string ms = "HTTP/1.0 200 OK\r\nContent-type: image/png\r\n\r\n";
ifstream myfile("xampl.png", ios::in|ios::binary|ios::ate);
string line;
char* memblock;
streampos size;
if(myfile.is_open()){
size = myfile.tellg();
memblock = new char [size];
myfile.seekg (0, ios::beg);
myfile.read (memblock, size);
myfile.close();
}
ms.append(string(memblock));
cout << "\"" << ms << "\"" << endl;
char* msg = new char[ms.size()+1];
copy(ms.begin(), ms.end(), msg);
msg[ms.size()] = '\0';
int len;
ssize_t bytes_sent;
len = strlen(msg);
bytes_sent = send(new_sd, msg, len, 0);

Я знаю, что я пытаюсь прочитать файл PNG в виде двоичного файла, но я понятия не имею, что еще делать. Когда я telnet к этому серверу, я получаю ответ со странными символами, которые заставляют меня полагать, что я передал файл, но когда я проверяю его в своем браузере, я получаю значок изображения не найден, во всех браузерах. Пожалуйста помоги…

0

Решение

Хорошо, давайте начнем с эквивалентного кода PHP, чтобы избавиться от беспорядка, который он делает в C ++.

// send required headers as plain text
header("Content-type: image/png");

// read the image as a binary block
$img_data = file_get_contents("xample.png");

// send it
echo $img_data;

C ++ эквивалент:

string headers = "HTTP/1.0 200 OK\r\nContent-type: image/png\r\n\r\n";
send (new_sd, headers.data(), headers.length(), 0);

ifstream f("xampl.png", ios::in|ios::binary|ios::ate);
if(!f.is_open()) error ("bloody file is nowhere to be found. Call the cops");
streampos size = f.tellg();
char* image = new char [size];
f.seekg (0, ios::beg);
f.read (image, size);
f.close();

send (new_sd, image, size, 0);
1

Другие решения

преобразование memblock строка не будет работать, если в нее встроены нулевые символы, что почти наверняка так, и вы не передаете длину. Я не уверен, почему ты делаешь все это с char*с и std::stringс, но как только у вас есть memblock а также sizeиспользуйте их для send, Если вы хотите добавить префикс строки ответа, просто send это первое.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector