gpt4 book ai didi

c - HTTP 持久连接

转载 作者:IT王子 更新时间:2023-10-29 00:53:42 31 4
gpt4 key购买 nike

尝试使用 Linux 套接字接口(interface)在 C 中实现一个简单的 HTTP 服务器时,我遇到了一些我希望它具有的特定功能的困难,即持久连接。使用单独的 TCP 连接一次发送一个文件相对容易,但它似乎不是非常有效的解决方案(例如考虑多次握手)。无论如何,服务器应该在一个 TCP 连接期间处理多个请求(HTML、CSS、图像)。你能给我一些解决问题的线索吗?

最佳答案

这很简单 - 只需在写完回复后不要关闭 TCP 连接即可。

有两种方法可以做到这一点,流水线和非流水线。

在非流水线实现中,您在套接字上读取一个 http 请求,处理它,将其写回套接字,然后尝试读取另一个请求。继续这样做,直到远程方关闭套接字,或者在大约 10 秒后停止在套接字上收到请求后自行关闭套接字。

在流水线实现中,读取与套接字上一样多的请求,并行处理它们,然后将它们全部写回到套接字上,顺序与接收它们的顺序相同。您始终有一个线程读取请求,而另一个线程再次将它们写出。

您不必这样做,但您可以通过在回复中添加以下 header 来宣传您支持持久连接和流水线:

Connection: Keep-Alive

读这个: http://en.wikipedia.org/wiki/HTTP_persistent_connection

顺便说一句,在实践中持久连接并没有太大的优势。与将数据读取和写入网络套接字所花费的时间相比,管理握手的开销非常小。关于持久连接的性能优势存在一些争论。一方面,在重负载下,保持连接打开意味着在 TIME_WAIT 中系统上的套接字要少得多。另一方面,因为您将套接字保持打开状态 10 秒,所以在任何给定时间打开的套接字都比在非持久模式下打开的多。

如果您有兴趣提高自写服务器的性能 - 提高服务器网络“前端”性能的最佳方法是实现基于事件的套接字管理系统。查看 libev 和 eventlib。

关于c - HTTP 持久连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16876078/

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