HTTP服务器通过多个数据包发送数据的正确方法是什么?
例如,我想传输一个文件,我发送的第一个数据包是:
HTTP/1.1 200 OK
Content-type: application/force-download
Content-Type: application/download
Content-Type: application/octet-stream
Content-Description: File Transfer
Content-disposition: attachment; filename=test.dat
Content-Transfer-Encoding: chunked
400
<first 1024 bytes here>
400
<next 1024 bytes here>
400
<next 1024 bytes here>
现在我需要制作一个新数据包,如果我发送:
400
<next 1024 bytes here>
所有客户关闭我的连接,文件被缩短。
我在第二个数据包中放入哪些标头以继续使用数据流?
答案 0 :(得分:3)
HTTP没有数据包的概念。您的HTTP流甚至可以分解为1个字节的数据包。
对于分块编码,您必须为RFC中给出的每个块(与数据包无关)指定所需的标头。
答案 1 :(得分:3)
我的缺乏代表似乎不允许我对这个问题发表评论,只是回答它,所以我假设“你正试图在嵌入式设备的Web服务器上实现HTTP 1.1”有一个面向数据包的网络堆栈而不是面向流的网络堆栈“是真的,或者你不会谈论数据包。 (如果你在谈论块,请参阅其他答案。)
鉴于此 - 如果可以,请使用套接字;你不应该在数据包中思考。你的网络堆栈可能有一个包装器。如果没有,请写一个不会使你的表现太糟糕的一个。
如果你不能,无论出于何种原因 - 你可能会掏出第一个数据包的大小。您的MTU可能类似于1500或1492(或更小),并且您在第一个数据包中列出了+ 5 + 1024 + 5 + 1024 + 5 + 1024字节。您的网络堆栈可能足够糟糕,它没有给您错误代码,或者您的代码可能没有检查它们 - 或者它可能正在做其他同样无用的事情。
答案 2 :(得分:2)
首先,您想要的标题是
Transfer-Encoding: chunked
不是Content-Transfer-Encoding
。
另外,为什么要发送三个不同的Content-Type
标题?
答案 3 :(得分:2)
通常,您将使用服务器端的Accept-Ranges
和Content-Range
标头来通知客户端服务器接受简历。然后,客户端将发回Range
标头以请求部分下载。
由于Content-Range
标题需要一个完整文件长度的概念,而且这里似乎未知(否则完全没有理由选择chunked
编码),你会丢失的到标准的HTTP规范。您可以选择其他协议,也可以自行生成自己的规范,或者寻找其他方法来预先找到内容长度。
尽管如此,三个Content-Type
标题毫无意义。选一个。 Content-Transfer-Encoding
也是错误的,应该是Transfer-Encoding
。
答案 4 :(得分:0)