Я не могу получить изображения для отображения в моем прокси-сервере на основе C

Поэтому я пытаюсь создать прокси-систему на основе C, и у меня возникают проблемы с чтением данных изображения, которые проходят через соединение. Я обычно посещаю страницы по большей части, но когда я пытаюсь отправить данные изображения обратно в браузер с сервера, я не вижу изображение. Ниже приведен код, используемый для получения данных с сервера, а затем отправьте сообщение в браузер. Надеюсь, у кого-то будет ключ, который поможет мне, спасибо! * Прокси блокирует нечетное содержимое байта от показа, эту часть кода там, но изображение, которое я пытаюсь загрузить, равно числу байтов.

do {

 //Receive message from server
 bytes = recv(clientsockfd, messagein, MAX_MESSAGE_LENGTH, 0);

 if(bytes > 0)
 strncpy(messageout,messagein,bytes);

 else if(bytes == 0) {
 printf("\nConnection closed\n");
 strcpy(messageout,"HTTP/1.1 200 OK\r\n\r\n");
 }

 printf("Answer received from server: \n");
 printf("%s\n\nTotal Bytes: %d\n\n", messagein, bytes);

 //Copy the messagein to a tempStr so we can leave original message untouched
 strncpy(tempStr,messagein,bytes);

 //Check to see if the content is even or odd only if the message in has a content length field, later we will determine if we do anything with it
 if(strstr(messagein,"Content-Length:") != NULL)
 evenContent = checkContent(tempStr);

 //If the content is odd then we want to change the message we'll send back to the browser
 if(!evenContent) {
 //If the page is odd then I redirect the user to carey error page he made
 if(strstr(messagein,"text/html") != NULL)
 strcpy(messageout,"HTTP/1.1 302 Found\r\nLocation: http://pages.cpsc.ucalgary.ca/~carey/CPSC441/errorpage.html\r\n\r\n");
 else if(strstr(messagein,"image/") != NULL) {
 //If the image is odd then I just send back empty data to the browser
 strcpy(messageout,"HTTP/1.1 200 OK\r\n\r\n");
 }
 }
#ifdef DEBUG
 printf("\n\nAbout to send message to the web browser:\n%s",messageout);
#endif
 /* send the result message back to the browser */
 send(childsockfd, messageout, bytes, 0);

 /* initialize message strings just to be safe (null-terminated) */
 for( i = 0; i < MAX_MESSAGE_LENGTH; i++ )
 {
 messagein[i] = '\0';
 messageout[i] = '\0';
 tempStr[i] = '\0';
 }

 } while (bytes != 0);
1 ответ

Вы предполагаете, что заголовок и контент получаются вместе одним вызовом recv. Но для большого запроса это может быть неверным (и изображения обычно большие). Чтобы выполнить разбор права, вы должны вызвать recv пока не будет обработан заголовок, включая длину содержимого, а затем вызовите recv пока вы не получите количество байтов длины содержимого.

licensed under cc by-sa 3.0 with attribution.