Frage

Ich schreibe einen sehr einfachen Webserver in C (Winsock2).

Ich kann den Inhalt meiner HTML -Seiten zurückgeben.

Derzeit schreibe ich den Inhalt einer Datei in einen char* puffer und sendet ihn mit "send ()".

Obwohl ich beim Versuch, ein Bild (JPG, BMP) zu lesen, kann ich die Zeichen nicht in einen Puffer schreiben. Einige Zeichen sind "null" (0).

Wie kann ich eine ganze Bilddatei senden?

Vielen Dank.

War es hilfreich?

Lösung

Sie können den Nullcharakter in a speichern char* Puffer. Sie müssen nur einen Zähler verwenden, um sich daran zu erinnern, wie viele Zeichen geschrieben wurden, anstatt ihn neu zu berechnen, indem Sie die Anzahl der Nicht-Null-Zeichen zählen (dies kann entweder eine Ganzzahl oder ein Zeiger auf den nächsten Einfügungspunkt in den Puffer sein).

Um eine Datei zu senden, werden Sie so etwas tun:

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

Andere Tipps

Sie müssen verstehen, wie send () und fread () funktionieren. 0s im Puffer sind kein Problem für Send oder Fread - sie interpretieren ihre Puffer nicht als null -terminierte Saiten.

Je nachdem, wie Sie das Bild in Ihren Webserver laden, müssen Sie entweder verwenden Winsock: Senderpakete oder Winsock: Senderfile, Wickeln Sie auch das Bild in die entsprechenden HTTP -Headers ein

Beachten Sie, dass dies MS -spezifische Erweiterungen sind.

Siehe auch C ++ - Bitmap -Übertragung mit Winsock getDits und Setdibits

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top