Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C HTTP持久连接_C_Linux_Sockets_Http - Fatal编程技术网

C HTTP持久连接

C HTTP持久连接,c,linux,sockets,http,C,Linux,Sockets,Http,尝试使用Linux套接字接口在C中实现一个简单的HTTP服务器时,我遇到了一些困难,因为我希望它具有某种特性,即持久连接。使用单独的TCP连接一次发送一个文件相对容易,但这似乎不是非常有效的解决方案(例如考虑多次握手)。无论如何,服务器应该在一个TCP连接期间处理多个请求(HTML、CSS、图像)。你能给我一些如何解决这个问题的线索吗?这很简单,只是在写回复后不要关闭TCP连接 有两种方法可以做到这一点,流水线和非流水线 在非流水线实现中,您读取套接字上的一个http请求,对其进行处理,将其从套

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

这很简单,只是在写回复后不要关闭TCP连接

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

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

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

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

Connection: Keep-Alive
请阅读以下内容:

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


如果您对提高自编服务器的性能感兴趣,那么要提高服务器网络“前端”的性能,最好的办法就是实现一个基于事件的套接字管理系统。查看LeBeV和EnviLB.

,你是否考虑过使用或至少学习C中的一些HTTP服务器免费库的源代码,比如D.Moreno的?实现一个完整的HTTP服务器堆栈需要大量的工作。使用持久连接的另一个巨大优势(基于我从书中读到的内容)是跳过“慢启动”阶段,更多地利用带宽。