Как обработать частичный ответ от сервера? - PullRequest
1 голос
/ 16 марта 2012

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

Мой сервер успешно получает запросы от браузера, а затем успешно отправляет их на хост, где бы они ни находились. И я успешно получаю ответы от хозяина! Кроме того, вот что я получаю, когда пытаюсь подключиться к Google через сервер:

Rcvd message from server: 

----

HTTP/1.1 200 OK
Date: Thu, 15 Mar 2012 20:35:11 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=83a7c2e6675a9a9f:FF=0:TM=1331843711:LM=1331843711:S=7I7RIVV1B-HxhWJR; expires=Sat, 15-Mar-2014 20:35:11 GMT; path=/; domain=.google.com
Set-Cookie: NID=57=KvqnXtYNkJZBryXL5zzhG5eH8Or2_PDWDqT_kU35PvOro_mAFiLiTSjPHOnWWxxm3R0vKYnzEeVkAPFKK366lZiNZGpjhO2-II5OeZQnWe09H-jZdePsrN-SnBdQ2ENT; expires=Fri, 14-Sep-2012 20:35:11 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked

1000
<!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta name="description" content="Search the world&#39;s information, including webpages, images, videos and more. Goo

Вы видите, как это отсекается? Из-за «Transfer-Encoding: chunked». Теперь, как мне заставить сервер продолжать посылать мне остальные куски? Потому что после этого первого он останавливается. Нужно ли поместить read () в цикл while и сказать, чтобы продолжить чтение и пересылку клиенту, пока есть что прочитать?

EDIT:

Хорошо, вот мой настоящий код. Это делает одно начальное чтение ответа сервера (в сокете с именем «sock»), записывает его клиенту («newsock»), затем вводит цикл while для продолжения чтения дополнительных ответов сервера и отправки их клиенту. я еще не проверял эту форму кода. Вы видите какие-либо вопиющие проблемы, кроме пробелов в проверке ошибок?

/*WRITING SERVER RESPONSE TO CLIENT*/

  char buffer2[1024];

  n = read(sock, buffer2, 1024 );

  if ( n < 1 )
  {
    perror( "read() failed" );
    return EXIT_FAILURE;
  }

  else
  {
    buffer2[n] = '\0';
    printf( "Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2 );
  }

  n = write( newsock, buffer2, strlen( buffer2 ) );

  while((n = read(sock, buffer2, 1024 )) >= 1)
  {
      buffer2[n] = '\0';
      printf( "Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2 );
      n = write( newsock, buffer2, strlen( buffer2 ) );
  }

1 Ответ

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

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

И окончание вашей строки символом '\ n' становится бесполезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...