как отправить изображение в winsock2, используя c - PullRequest
0 голосов
/ 16 марта 2011

Я пишу очень простой веб-сервер на c (winsock2).

Я могу вернуть содержимое моих html-страниц.

В настоящее время я пишу содержимое.файла в буфер char * и отправка его с помощью «send ()»

Хотя при попытке прочитать изображение (jpg, bmp) я не могу записать символы в буфер и некоторые символыявляются "нулевыми" (0).

Как отправить файл изображения целиком?

Спасибо.

Ответы [ 3 ]

1 голос
/ 16 марта 2011

Вы можете сохранить нулевой символ в буфере char*.Вам просто нужно использовать счетчик, чтобы запомнить, сколько символов было написано, вместо того, чтобы пересчитывать его путем подсчета количества ненулевых символов (это может быть либо целое число, либо указатель на следующую точку вставки в буфер).

Чтобы отправить файл, вам нужно сделать что-то вроде этого:

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;
        }
    }
}
1 голос
/ 16 марта 2011

Вам нужно понять, как работают send () и fread (). 0 в буфере не являются проблемой для отправки или обработки - они не интерпретируют свои буферы как строки с нулевым символом в конце.

0 голосов
/ 16 марта 2011

В зависимости от того, как вы загружаете изображение в ваш веб-сервер, вам нужно будет использовать либо Winsock: TransmitPackets или Winsock: TransmitFile , а также обертывание изображения в соответствующие заголовки HTTP

Обратите внимание, что это расширения для MS.

Также см. c ++ - Передача растрового изображения с использованием getdibits и setdibits winsock

...