Почему фактические байты читаются из ответа сервера меньше, чем Content-Length? - PullRequest
0 голосов
/ 04 марта 2012

Я пишу прокси на C в ядре Linux 3.0.Прокси-сервер перенаправляет запрос из браузера на целевой сервер и читает ответ от сервера.

Это один запрос:

GET http://www.yongchuan.org/ HTTP/1.1
Host: www.yongchuan.org
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Proxy-Connection: keep-alive

Это один ответ, который прокси-сервер прочитал:

HTTP/1.1 200 OK
Content-Length: 3170
Content-Type: text/html
Content-Location: http://www.yongchuan.org/index.html
Last-Modified: Fri, 22 Jul 2011 01:28:50 GMT
Accept-Ranges: bytes
ETag: "72d9d7b5e48cc1:1a73"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Sun, 04 Mar 2012 16:26:05 GMT

<html>

<head>

..............

<tr> 
  <td width="43%" ></td>
  <td width="46%"></td>
</tr>
<tr>
  <td width="43%"><img src="images/triangle.gif"> ��ѧ�ڿγ̣�<a href="jiangyi/yytl/2007(a)/yytl.htm">Ӧ��ͼ��</a></td>
  <td width="46%" ><img src=

Проблема в том, что фактический размер байтов, которые читает прокси-сервер, равен 2880, и данные неожиданно заканчиваются, намного меньше, чем длина контекста: 3170.

Мой код такой, как показано ниже:

241 int readlen;
242 char buffer[128 * 4096];
243 do { 
244     readlen = read(servfd, buffer, 128 * 4096);
245     printf("readlen:%d\n", readlen);
246     if( readlen < 0 ) {
247         perror("read() from server failed");
248     }   
249     printf("read content:\n%s", buffer2);
250     write(cliefd, buffer, readlen);
251 } while( readlen == 128 * 4096 );

Здесь servfd - это сокет для сервера, cliefd - это сокет для клиента.Какова возможная причина?Спасибо!

1 Ответ

2 голосов
/ 04 марта 2012
while( readlen == 128 * 4096 );

Неправильное условие while.Вместо этого вы должны проверять readlen > 0.

Не требуется, чтобы read только вручал вам полностью заполненные буферы.В худшем случае (очень маловероятно с текущими стеками TCP), он может передать вам байты один за другим.пока вы не получите Content-Length вам обещали.

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