gpt4 book ai didi

c - 没有数据读取时socket read()会挂一会

转载 作者:太空狗 更新时间:2023-10-29 11:48:02 25 4
gpt4 key购买 nike

您好,我正在编写一个简单的 http 端口转发器。我从端口 80 读取数据,并将数据传递到端口 8080 上的我的 lighttpd 服务器。

只要我在端口 8080 上的套接字上 write() 数据(转发请求)就没有问题,但是当我从那个套接字中读取()数据(转发响应)时,最后一个 read() 挂了很多(大约 1 或 2 秒),然后才意识到没有更多数据并返回 0。

我尝试将套接字设置为非阻塞,但这不起作用,因为有时它会返回 EWOULDBLOCKING,即使还有一些数据剩余(lighttpd + cgi 可能非常慢)。我尝试使用 select() 设置超时,但是,如上所述,当实际上有一些数据要传输时,慢速 cgi 可能会使套接字超时。


更新:已解决。毕竟是保活。在我的 lighttpd 配置文件中禁用它之后,整个事情运行完美。

最佳答案

好吧,为了完成,按照我的评论:

很可能是 HTTP 服务器本身(在您的情况下是 lighttpd)正在维护与您的代理的持久连接,因为您的代理中继了一个包含“Connection: keep-alive”的 header 。当客户端想要通过同一连接发出多个请求时,此 header 会有所帮助。因此,因为 lighttpd 收到了这个 header ,它假设它会收到更多请求并保持套接字打开,导致 read 在您的代理中阻塞。

在你的 lighttpd 配置中禁用 keep-alive 是修复它的一种方法,但你也可以在将它中继到你的 web 服务器之前从 header 中删除“Connection: keep-alive” .

关于c - 没有数据读取时socket read()会挂一会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2896698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com