为什么从服务器响应中读取的实际字节数小于Content-Length?

时间:2012-03-04 17:10:21

标签: c linux sockets

我在Linux 3.0内核中用C语言编写代理。代理将请求从浏览器转发到目标服务器并从服务器读取响应。

这是一个请求:

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 个答案:

答案 0 :(得分:2)

while( readlen == 128 * 4096 );

while条件错了。您应该检查readlen > 0

并不要求read只让你完全填充缓冲区。在最坏的情况下(当前的TCP堆栈极不可能),它可以逐个递送字节。

无论如何,如果服务器在交付输出后没有关闭连接,你必须继续阅读,直到你得到你承诺的Content-Length