【发布时间】:2009-09-22 21:01:09
【问题描述】:
我在下载开始时有可用的内容长度。所以我知道我需要请求多少字节。 我以 1024 字节的块下载。在最后一个块中,我请求剩余的字节数。我正在使用读取功能。 但是最后一块需要很长时间才能到达。正常吗?
【问题讨论】:
-
如果你的浏览器和telnet都能正常处理,而你的客户端没有,为什么不贴相关代码sn-p。
我在下载开始时有可用的内容长度。所以我知道我需要请求多少字节。 我以 1024 字节的块下载。在最后一个块中,我请求剩余的字节数。我正在使用读取功能。 但是最后一块需要很长时间才能到达。正常吗?
【问题讨论】:
也许您的最后一个块不够大,无法刷新缓冲区。
您可以检查如何刷新 fd 并在发送最后一个块后手动执行。
【讨论】:
没有。我的猜测是服务器缺少对flush() 的调用,因此输出会挂在某个缓冲区中,直到超时(然后,服务器将刷新)。
【讨论】:
head 之后调用flush 是一个好主意,这样浏览器就可以在页面的其余部分正在写入时开始加载head 的内容/加载。浏览器一旦通过网络获取标记,也会尝试解析/呈现页面。这可能就是您在浏览器中看到立即呈现的原因。
谢谢 我解决了这个问题。我的代码使用应用程序级缓冲区,因此最后一个块需要很长时间才能下载。 我一直在使用 Bryant 书中给出的强大的 io 函数。一段时间前我研究过该代码并忘记了它。我修改了代码,发现代码正在使用缓冲。
我犯的另一个错误是使用 HTTP/1.1。 HTTP 1.0 导致服务器在传输数据后关闭连接。 这样就解决了问题。
【讨论】:
Keep-Alive: close