¿Cómo leo una imagen para enviarla a través de un socket?

Estoy creando un servidor web muy simple, como la práctica en C ++ y sockets. Yo uso OSX.

El ejemplo de código es del interior del bucle while (1), se ha realizado una conexión y estoy empezando a procesar el encabezado. Este código funciona para todos los archivos de texto, pero no funciona con imágenes. Y me imagino que no puedo usar el mismo método para leer archivos de texto e imágenes, ya que las imágenes no están separadas por líneas. Pero, ¿cómo leo los datos de la imagen para enviar a través del socket? Es posible que ni siquiera pueda usar una cadena, ¿tengo que usar 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

La pregunta es cómo leer los datos de la imagen.

*EDITAR 2011-05-19 *

Entonces, esta es una versión actualizada de mi código. El archivo se ha abierto con ios :: binary, sin embargo, hay más problemas.

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++;
}

El problema es que parece que char * fileContents se vacía cada ~ 240 caracteres. ¿Como puede ser? ¿Existe algún tipo de límite para algunas de estas funciones de que solo aceptan cierta longitud?

preguntado el 16 de mayo de 11 a las 18:05

2 Respuestas

Abra el archivo para lectura binaria, almacene los datos en una matriz char * lo suficientemente grande, luego envíe esa matriz.

contestado el 16 de mayo de 11 a las 22:05

Entonces ios :: binary supongo ?. Pero, ¿cómo sé qué tamaño es "suficientemente grande"? - Emil

@Emil: Lea fragmentos de datos hasta que llegue al EOF. Seguramente hay una forma mejor, pero no conozco tan bien C ++: P - Oso negro

@Emil: o mira aquí (primer resultado de google) cplusplus.com/forum/windows/10853 - Oso negro

Como dijo @Blackbear, pero no olvides enviar los encabezados HTML correspondientes como contentEncoding, transferEncoding, etc. Para simplificar, intenta enviar los datos binarios de la imagen codificada en base64.

contestado el 16 de mayo de 11 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.