收到服务器响应并将其发送到浏览器?

时间:2012-03-16 00:31:23

标签: c http network-programming

这是我正在编写的基本代理服务器的一部分。此代码读取服务器对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");

1 个答案:

答案 0 :(得分:1)

一些建议:

  • 检查read的返回码是否为零值和负值 n > 0表示n个字节的数据可用 n == 0表示对等方已关闭连接
    n < 0表示错误。

  • 如果您的套接字是非阻塞的,请不要在EAGAINEWOULDBLOCK错误时退出循环,这意味着没有可用的数据,但连接仍处于打开状态(所以可能会有更多数据出现。)

  • 同时检查write的返回代码。

  • 从套接字返回的数据可以是二进制的(这就是read返回它收到的字节数的原因)。如果数据恰好包含零字节,则printf将在此时截断其输出,strlen将导致write的行为类似。请务必打印/写入所有n个字节。

  • 在调试器中运行代码,这样您就可以 看看发生了什么。