Pregunta

Estoy escribiendo un servidor web muy simple en C (Winsock2).

Puedo devolver el contenido de mis páginas HTML.

Actualmente, lo que estoy haciendo es escribir el contenido de un archivo en un búfer de char* y enviarlo usando "send ()"

Aunque cuando trato de leer una imagen (JPG, BMP), no puedo escribir los personajes en un búfer, algunos personajes son "nulos" (0).

¿Cómo puedo enviar un archivo de imagen completa?

Gracias.

¿Fue útil?

Solución

Puedes almacenar el personaje nulo en un char* buffer. Solo tiene que usar un contador para recordar cuántos personajes se escribieron, en lugar de recomputarlo contando el número de caracteres no nulos (esto puede ser un entero o un puntero al siguiente punto de inserción en el búfer).

Para enviar un archivo, hará algo así:

int sendFile(int sock, const char* filename) {
    FILE* file = fopen(filename, "rb");
    if (file == NULL)
        return -1;

    if (fseek(file, 0, SEEK_END) != 0) {
        fclose(file);
        return -1;
    }

    off_t size = ftello(file);
    if (fseek(file, 0, SEEK_SET) != 0) {
        fclose(file);
        return -1;
    }

    if (SendBinaryFileHeaderAndSize(sock, size) < 0) {
        fclose(file);
        return -1;
    }

    char buffer[4096];
    for (;;) {
        size_t read = fread(buffer, 1, sizeof(buffer), file);
        if (read == 0) {
            int retcode = 0;
            if (ferror(file))
                retcode = -1;
            fclose(file);
            return retcode;
        }

        for (size_t sent = 0; sent < read;) {
            int ret = send(sock, buffer + sent, read - sent, 0);
            if (ret < 0) {
                fclose(file);
                return -1;
            }

            assert(ret <= read - sent);
            sent += ret;
        }
    }
}

Otros consejos

Debe comprender cómo funciona () y fread (). 0s en el búfer no son un problema para el envío o Fread: no interpretan sus amortiguadores como cadenas terminadas.

Dependiendo de cómo cargue la imagen en su servidor web, necesitaría usar Winsock: Comacétes de transmisión o Winsock: transmitfile, también envolviendo la imagen en los encabezados HTTP apropiados

Tenga en cuenta que estas son extensiones específicas de MS.

Ver también C ++ - Transferencia de mapa de bits usando getDibits Winsock y setDibits

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top