0

我在我的 LINUX 机器上使用 C 语言的 TCP 套接字编程制作了一个非常简单的 Web 服务器。我从本地机器的浏览器(chrome 和 mozilla)向它发送 HTTP GET 请求。这个问题是当我没有在响应中设置标题
Transfer-Encoding: chunked时,浏览器成功显示网页。但是当我保留这个标题时,浏览器没有响应,它说NO DATA IS AVAILABLE

编辑:在我添加@RomanK指出的块大小(446字节)后,它现在适用于firefox。但是铬变得没有反应。

这是代码

 responseIndex = add(response,"HTTP/1.1 200 OK",responseIndex);

 responseIndex = add(response,"Transfer-Encoding: chunked",responseIndex);


 responseIndex = add(response,"Content-Type: text/html",responseIndex);

response[responseIndex++]='\r';

response[responseIndex++]='\n';

updateIndex = add(response,"446",updateIndex);

responseIndex = add(response,filebuffer,responseIndex);

response[responseIndex++]='\0';   


send(clntSock, response, strlen(response), 0) ;

close(clntSock);
exit(0);

这里,add是将第二个参数附加到响应然后附加“/r/n”的函数。

响应是一个字符串。

responseIndex只是一个用于跟踪当前响应长度的 int。

filebuffer是一个字符串,其中包含要发送的 html 文件的所有文本。

回复 :

              HTTP/1.1 200 OK
              Transfer-Encoding: chunked
              Content-Type: text/html

              446 (or 1EB)
              <html>
              BODY
             </html>

chrome给出的错误代码是:ERR_INVALID_CHUNKED_ENCODING

4

2 回答 2

1

Content-Length和分块传输编码是互斥的。

根据Wikipedia 文章Content-Length,您应该在每个块的开头省略并添加块大小。

或者,换句话说,您需要在此行之前以十六进制输出块大小

responseIndex = add(response,filebuffer,responseIndex);

编辑:请注意,您只需要提供块的大小,而不是整个 HTTP 响应的大小。在您的情况下,它应该只是 HTML 正文的大小;例如,看起来您的样本主体的十六进制大小为 30 或 31(不确定空格)。

所以,3分:a)使用十六进制b)使用小写c)使用块的大小(在你的情况下,主体,因为你有一个块)。不包括 HTTP 元数据的大小。

首先使用块也有点问题。只有在开始生成响应时您不知道响应大小的情况下才应使用它们。在这里,您一开始就知道响应大小,并且可以Content-Length不使用Transfer-Encoding: chunked.

于 2015-03-26T18:24:33.503 回答
-1

分块传输的要点是(抱歉重言式)以块的形式发送数据。浏览器不知道需要多少块,因此您需要告诉它某个块是最后一个块。协议规定最后一个块的大小应为 0:

          HTTP/1.1 200 OK
          Transfer-Encoding: chunked
          Content-Type: text/html

          446\r\n
          Precisely 446 bytes of data
          0\r\n
于 2015-03-26T20:35:22.447 回答