Двоичные данные изображения не считываются правильно

#c #file #http #webserver

Вопрос:

Я работаю на веб-сервере на языке Си и пытаюсь отправить изображение по протоколу http. Я наткнулся на пару сайтов, на которых говорилось, что я могу отправлять двоичные файлы напрямую через http, поэтому я решил это сделать. Итак, теперь я пытаюсь прочитать двоичные данные изображения, но они либо отправляются неправильно, либо я неправильно читаю двоичный файл. вот код для чтения и отправки:

 FILE * fpointer = fopen(fileDir, "r");
        while (fread(fileLine, sizeof(fileLine), 1, fpointer) != 0) {
            if ((write(acceptSock, httpResponse, strlen(httpResponse))) == -1) {
                perror("write error1");
            }

            printf("%s", fileLine);

            if ((write(acceptSock, fileLine, strlen(fileLine))) == -1) {
                perror("write error2");
            }

            memset(fileLine, 0, 8);
            memset(httpResponse, 0, 1000);
        }
        fclose(fpointer);
        close(acceptSock);
        memset(recvLineGET, 0, 60);
        memset(fileDir, 0, 255);
 

и это образец двоичного файла, который читается:

 M(???u???g????W???F?ʆ??âSn,?S??O??F?c??S>?9v>nX?G6??6n?
?|{?????l絰?N???ד?ܢ????c^?_?#η??H???9??y?PC?`?N??[?2???8????5)???DZ?mfL
                                                                       Zٓp???1???d}?
?>?dC??6,?I?$??0 Q#"???S<???i?$?μ??amp;????/??Ȼ2AJc'(`?L   D?(?<E?hMD?2?r ???"?7?D?%??c?????A"I?
             ??p/%?Qe?*E?`Z?dYRamp;?d2Er<`??ڮ
4?3,??,Zh?@f??YYV0??Θ~?=_??sڟ?t:??W?????F_??<7?b??????Z`"J
                                                          ??5???z<ߧ?S???????E?l?y???]?#???(0N?$q?8L???4.???ʾI?,??Q??8]$?V?^??`??????? '?IQ?]-???bε?K??3?[??    d????8?{?J?D??,D???O??DZ??<

 

Комментарии:

1. Вы рассматриваете «файловую линию» как массив символов с нулевым завершением. В коде netwotk, особенно при обработке общих двоичных данных, которые вполне могут содержать встроенные нули, лучше полностью избегать strlen и т. Д. В случае успеха функция fread() вернет количество прочитанных байтов. Вы даже не проверяете, было ли открытие файла успешным:(