2012-03-15 101 views
1

我正在用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 

您看到它是如何切断的?由于“传输编码:分块”。现在如何让服务器继续向我发送其余的块?因为在第一个之后,它停止。我是否需要在while循环中放置read(),并且只要有东西要阅读,就说要继续阅读并转发给客户端?

编辑:

好的,这是我现在的代码。这使服务器的响应(在名为“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

你能详细说明你做了什么(放置你的相关C代码),你为什么说它会被切断? – roni 2012-03-15 21:00:31

+0

我couuullld附加了一些代码,除了我一直在编辑它,试图自己解决它,我还没有测试过,所以在这一刻我不知道它会做什么。需要一些时间。而且我认为如果您向右滚动,您会看到截止日期 - 显然Google.com的代码不止于此。它只停留在meta标签的中间。还有更多未来。 – Aerovistae 2012-03-15 21:01:35

+0

@Aerovistae,你如何使用内容长度作为回应? – perreal 2012-03-15 21:07:24

回答

1

不能使用strlen得到您的缓冲区的大小,strlen的只为得到一个字符串的大小,你可能读一些二进制数据,因为不仅可以通过文字去你的代理(图片...)。尝试使用read而返回的值,这是实际读取的字节数。

以'\ n'结尾字符串变得毫无用处。

+0

但块是文本和图像的混合,他们不是?我应该永远不会空终止,否则会导致文本部分的错误? – Aerovistae 2012-03-16 02:51:39

+1

你没有任何理由来终结问题,就是你在推理,就好像它在琢磨哪一个不是原始数据。所以在你的数据中间你可能会得到一个等于0的字节。这就是你的strlen不工作的原因。不要认为这是文本和图像,而是数据。所以没有理由终止 – Mualki 2012-03-16 03:03:32

+0

可以在char数组中保存原始数据吗?我不知道还有什么其他类型的变量。 – Aerovistae 2012-03-16 03:04:52

相关问题