我在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是客户端的套接字。 可能的原因是什么?谢谢!
答案 0 :(得分:2)
while( readlen == 128 * 4096 );
while条件错了。您应该检查readlen > 0
。
并不要求read
只让你完全填充缓冲区。在最坏的情况下(当前的TCP堆栈极不可能),它可以逐个递送字节。
无论如何,如果服务器在交付输出后没有关闭连接,你必须继续阅读,直到你得到你承诺的Content-Length
。