2012-03-16 172 views
0

这是我在写一个基本的代理服务器的一部分。此代码读取服务器对HTTP请求的响应,然后将其写回客户端(浏览器)。当我用firefox测试它时,它会加载我的大部分主页,但无法加载图像。然后它会冻结,并且在初始页面之后我无法加载任何其他内容。可能是因为我没有正确关闭连接,以便它可以向我的代理发出另一个请求。我不知道该怎么做。这里接收服务器响应并将其发送到浏览器?

终端输出停止在“完成”。它不打印“重新开始”,但不打印“退出时循环”。所以我无法弄清楚它在哪里停滞不前,或者如何正确地结束连接,以便在加载Google之后,我实际上可以启动Google搜索或加载Gmail或其他任何内容。

while((n = read(sock, buffer2, 1024)) >= 1) 
    { 
     printf("Started over: %i :(\n\n", n); 

     buffer2[n] = '\0'; 
     printf("Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2); 
     n = write(newsock, buffer2, strlen(buffer2)); 

     printf("\n\nFinished.\n\n"); 
    } 

    close(sock); 
    printf("\n\nExited while loop.\n\n"); 
+0

这是你发布的另一个问题的副本:http://stackoverflow.com/questions/9728653/handling-a-server-response-and-sending-it-the-browser;也许你应该删除这一个。 – 2012-03-16 01:45:11

+0

是啊,我知道,但我是绝望的答案,我并没有得到one--我知道这是一件坏事。我通常不会这样做。我会删除其他。 – Aerovistae 2012-03-16 02:09:26

回答

1

几点建议:

  • 检查从read返回代码两者都为零和负值。
    n > 0  装置n个字节的数据是可用的
    n == 0意味着对等已经关闭了连接
    n < 0  表示错误。

  • 如果你的插槽是非阻塞的,不退出对一个EAGAINEWOULDBLOCK错误的循环,这意味着没有数据可用,但连接仍然是开放的(所以更多的数据可能是未来)。

  • 检查从write也返回代码。

  • 从插座返回的数据可以是二进制(这就是为什么read返回它接收到的字节数)。如果数据恰好包含一个零字节,则printf将截断其输出在这一点上,和strlen将导致write同样的行为。一定要打印/写入所有n字节。

  • 在调试器中运行代码,所以你可以真的看看发生了什么。

相关问题