【发布时间】:2011-02-23 05:06:08
【问题描述】:
嗨,我正在编写一个简单的 http 端口转发器。我从端口 80 读取数据,并将数据传递到我的 lighttpd 服务器,端口为 8080。
只要我在端口 8080 上的套接字上 write() 数据(转发请求)就没有问题,但是当我从该套接字读取()数据(转发响应)时,最后一个 read() 挂了很多(大约 1 或 2 秒)在意识到没有更多数据并返回 0 之前。
我尝试将套接字设置为非阻塞,但这不起作用,因为有时它会返回 EWOULDBLOCKING,即使还剩下一些数据(lighttpd + cgi 可能会很慢)。 我尝试使用 select() 设置超时,但是,如上所述,当实际上有一些数据要传输时,慢速 cgi 可能会使套接字超时。
更新:已解决。毕竟是keepalive。在我的 lighttpd 配置文件中禁用它后,整个事情运行完美。
【问题讨论】:
-
会不会是 Keep-Alive 的 HTTP 标头导致实际的 Web 服务器保持持久连接?
-
是的,当然可以。但是为什么 thre read() 没有立即意识到没有要读取的内容,而是等待 1/2 秒?
-
因为它在等待。实际的 Web 服务器仍然有一个打开的套接字,因此如果 Web 服务器要发送更多字节,
read可能仍然会成功。如果 Web 服务器关闭其套接字,read可能会立即返回。 -
好的,但是为什么这个问题只发生在我的服务器上?我的意思是,浏览器与 lighttpd 完美配合,而在我的服务器上,它等待了很多时间。
-
因为浏览器知道如何处理 Keep-Alive?