Я создаю очень простой веб-сервер, как практикуется в 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 символов. Как это может быть? Есть ли какое-то ограничение для некоторых из этих функций, что они принимают только определенную длину?