Question

Je suis en train d'écrire un serveur web très simple c (winsock2).

Je suis en mesure de retourner le contenu de mes pages html.

À l'heure actuelle, ce que je fais est écrit le contenu d'un fichier dans un char * tampon et l'envoyer à l'aide « send () »

Bien que j'essaie de lire une image (jpg, bmp), je ne peux pas écrire les caractères dans un tampon a certains caractères sont « null » (0).

Comment puis-je envoyer un fichier image entière?

Merci.

Était-ce utile?

La solution

Vous pouvez stocker le caractère null dans un tampon char*. Il vous suffit d'utiliser un compteur de se rappeler combien de caractères ont été écrits, au lieu de recalcul par numéro de comptage de caractères non nuls (cela peut être un entier ou un pointeur vers le prochain point d'insertion dans la mémoire tampon).

Pour envoyer un fichier, vous allez faire quelque chose comme ça:

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

Autres conseils

Vous devez comprendre comment le travail send () et fread (). 0 dans la mémoire tampon ne sont pas un problème pour envoyer ou fread - ils ne l'interprètent pas leurs tampons sous forme de chaînes terminées par null

.

Selon la façon dont vous chargez l'image dans votre serveur Web, vous devez utiliser soit Winsock: TransmitPackets ou Winsock: TransmitFile , également envelopper également l'image dans les en-têtes HTTP appropriée

Notez que ce sont des extensions spécifiques MS.

Voir aussi c ++ - Transfert Bitmap en utilisant GetDIBits winsock et SetDIBits

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top