你好,我正在编写一个简单的 http 端口转发器。我从端口 80 读取数据,并将数据传递到端口 8080 上的 lighttpd 服务器。
只要我在端口 8080 上的套接字上 write() 数据(转发请求)就没有问题,但是当我从该套接字读取()数据(转发响应)时,最后一个 read() 挂起很多(大约 1或 2 秒),然后意识到没有更多数据并返回 0。
我尝试将套接字设置为非阻塞,但这不起作用,因为有时即使还剩下一些数据,它也会返回 EWOULDBLOCKING(lighttpd + cgi 可能非常慢)。
我尝试使用 select() 设置超时,但是,如上所述,当实际有一些数据要传输时,缓慢的 cgi 可能会使套接字超时。
更新:已解决。毕竟这是保活。在我的lighttpd配置文件中禁用它后,整个过程完美运行。
好吧,为了完整起见,根据我的评论:
HTTP 服务器本身(在您的情况下为 lighttpd)可能正在与您的代理保持持久连接,因为您的代理中继了一个包含“Connection: keep-alive
”。当客户端想要通过同一连接发出多个请求时,此标头会有所帮助。因此,因为 lighttpd 收到了这个标头,所以它假设它将接收进一步的请求并保持套接字打开,从而导致read
阻止您的代理。
在 lighttpd 配置中禁用 keep-alive 是解决此问题的一种方法,但您也可以删除“Connection: keep-alive
“在将其转发到网络服务器之前从标头中获取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)