Domanda

Sto scrivendo un semplice server web in c (Winsock2).

Sono in grado di restituire il contenuto delle mie pagine HTML.

Al momento, quello che sto facendo è la scrittura il contenuto di un file in un char * buffer e inviarlo utilizzando "send ()"

Anche se quando provo a leggere un'immagine (jpg, bmp), non riesco a scrivere i caratteri in un buffer un alcuni caratteri sono "null" (0).

Come posso inviare un file di immagine intera?

Grazie.

È stato utile?

Soluzione

È possibile memorizzare carattere null in un buffer char*. È solo usare un contatore per ricordare quanti caratteri sono stati scritti, invece di ricalcolare dal numero di conteggio di caratteri non nulli (questo può essere sia un numero intero o un puntatore al successivo punto di inserimento nel buffer).

Per inviare un file, è fare qualcosa di simile:

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

Altri suggerimenti

È necessario capire come send () e fread) lavoro (. 0s nel buffer non sono un problema per l'invio o fread - non interpretano i loro buffer come stringhe null-terminate

.

A seconda di come si carica l'immagine nel server web, si avrebbe bisogno di utilizzare Winsock: TransmitPackets o Winsock: TransmitFile , anche anche avvolgendo l'immagine nella appropriata intestazioni HTTP

Si noti che questi sono estensioni specifiche MS.

Si veda anche C ++ - trasferimento Bitmap utilizzando Winsock GetDIBits e SetDIBits

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top