HTTP持久连接

Clu*_*ess 3 c sockets linux http

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

Raf*_*sta 11

这很简单 - 只需在写回复后关闭TCP连接.

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

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

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

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

Connection: Keep-Alive
Run Code Online (Sandbox Code Playgroud)

阅读:http: //en.wikipedia.org/wiki/HTTP_persistent_connection

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

如果您对提高自编写服务器的性能感兴趣 - 您可以做的最好的事情就是实现基于事件的套接字管理系统,以提高服务器网络"前端"的性能.查看libev和eventlib.