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

0

Поэтому я пытаюсь создать прокси-систему на основе 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);
Теги:
proxy
sockets
network-programming

1 ответ

1

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

  • 0
    Но когда я звоню «recv», разве он не сидит в ожидании сообщения? Так что моя программа не зависнет? Я подумал, что нужно проверить, существует ли Content-Length: в сообщении, и тогда я узнаю, является ли он заголовком или данными, а затем продолжу с кодом, проверяемое изображение теперь возвращает в общей сложности 3027 байт с заголовок включен, так что он помещается в буфер, моя главная проблема сейчас в том, почему даже это не работает
  • 0
    recv вернется, как только придет какое-то сообщение (обратите внимание, что оно не обязательно будет целым сообщением). Если вы беспокоитесь о зависании, вы можете установить время ожидания для сокета, используя setsockopt с флагом SO_RCVTIMEO .
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню