Как мне прочитать изображение для отправки через сокет? - PullRequest
0 голосов
/ 16 мая 2011

Я создаю очень простой веб-сервер, как практикуется в C ++ и сокетах. Я использую OSX.

Пример кода находится внутри цикла while (1), установлено соединение, и я начинаю обрабатывать заголовок. Этот код работает для всех текстовых файлов, но он не работает с изображениями. И я полагаю, что я не могу использовать один и тот же метод для чтения текстовых файлов и изображений, поскольку изображения не разделяются строками. Но как мне прочитать данные изображения для отправки через сокет? Возможно, я даже не смогу использовать строку, нужно ли использовать char *?

    string strFile  = "htdocs" + getFileFromHeader(httpRequestHeader);
    string strExt   = getFileExtension(strFile);

    string httpContent = "";
    ifstream fileIn(strFile.c_str(), ios::in); // <-- do I have to use ios::binary ?

    if(!fileIn)
    {
        // 404
        cout << "File could not be opened" << endl;
        httpContent = httpHeader404;
    }
    else
    {
        // 200
        string contentType = getContentType(strExt);
        cout << "Sending " << strFile << " -- " << contentType << endl;
        string textInFile = "";

        while (fileIn.good())
        {
            getline (fileIn, textInFile); // replace with what?
            httpContent = httpContent + textInFile + "\n";
        }

        httpContent = httpHeader200 + newLine + contentType + newLine + newLine + httpContent;
    }
    // Sending httpContent through the socket

Вопрос в том, как читать данные изображения.

* РЕДАКТИРОВАТЬ 2011-05-19 *

Итак, это обновленная версия моего кода. Файл был открыт с помощью ios :: binary, однако есть и другие проблемы.

httpContent = httpHeader200 + newLine + contentType + newLine + newLine;
char* fileContents = (char*)httpContent.c_str();
char a[1];
int i = 0;

while(!fileIn.eof())
{
    fileIn.read(a, 1);

    std::size_t len = std::strlen (fileContents);
    char *ret = new char[len + 2];

    std::strcpy ( ret, fileContents );
    ret[len] = a[0];
    ret[len + 1] = '\0';

    fileContents = ret;

    cout << fileContents << endl << endl << endl;

    delete [] ret;

    i++;
}

Проблема в том, что, похоже, char * fileContents очищает себя каждые ~ 240 символов. Как это может быть? Есть ли какое-то ограничение для некоторых из этих функций, что они принимают только определенную длину?

Ответы [ 2 ]

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

Откройте файл для двоичного чтения, сохраните данные в массиве char * достаточно большого размера, затем отправьте этот массив.

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

Как сказал @Blackbear, но не забудьте отправить соответствующие заголовки HTML, такие как contentEncoding, TransferEncoding и т. Д. Для простоты попробуйте отправить двоичные данные изображения, закодированного в base64.

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