c - HTTP 持久连接

标签 c linux sockets http

尝试使用 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/

相关文章:

python - 脚本适用于 Windows,但不适用于 Linux(语法错误)

c - 如何使用 select() 知道新客户端是否正在连接到套接字

linux - 将 grep 管道化为排序时出现问题

linux - 在 Windows 7 客户端和 Linux 服务器之间同步的最佳程序

linux - 尝试发送带有数据的 TCP SYN 数据包和带有数据的 RST,但原始数据字段在传输过程中消失。为什么?

sockets - IPPROTO_IP 和 IPPROTO_RAW 有什么区别?

c++ - 我想知道为什么两个输出不同

c - 如何将位域写入整数值?

python - 尝试在 Python 中加载 C DLL 时出现错误的 ELF 类

c - 上下文切换后我的线程永远不会完成