Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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/8/http/4.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_Http_Server_Connection_Keep Alive - Fatal编程技术网

用c编写支持连接持久性的http服务器

用c编写支持连接持久性的http服务器,c,http,server,connection,keep-alive,C,Http,Server,Connection,Keep Alive,当我从浏览器读取请求时,HTTP连接头总是带有一个Keep Alive值,因此我在向流写入响应后保持连接套接字描述符打开。我听说这会导致客户端(浏览器)重复使用相同的连接来发送下一个请求 但是客户端发送另一个connect()请求,以创建一个用于发送下一个请求的新连接 为什么浏览器在每个标题中都发送保持活动选项 客户端发送另一个connect()请求以创建新的连接以发送下一个请求 如果要向HTTP 1.0/1.1请求发送HTTP 1.0响应: 默认行为是连接:关闭,除非发送了连接:保持活动响应

当我从浏览器读取请求时,HTTP连接头总是带有一个
Keep Alive
值,因此我在向流写入响应后保持连接套接字描述符打开。我听说这会导致客户端(浏览器)重复使用相同的连接来发送下一个请求

但是客户端发送另一个
connect()
请求,以创建一个用于发送下一个请求的新连接

为什么浏览器在每个标题中都发送
保持活动
选项

客户端发送另一个connect()请求以创建新的连接以发送下一个请求

如果要向HTTP 1.0/1.1请求发送HTTP 1.0响应:

  • 默认行为是
    连接:关闭
    ,除非发送了
    连接:保持活动
    响应头(如果客户端发送了
    连接:保持活动
    请求头,则仅
    )。如果不发送,客户端将别无选择,只能关闭连接并每次创建一个新连接
如果要向HTTP 1.1请求发送HTTP 1.1响应:

  • 默认行为是
    Connection:keep alive
    ,除非发送了
    Connection:close
    响应头,所以请确保您没有发送该响应头,除非客户端发送了
    Connection:close
    请求头,或者您有意关闭连接

无论哪种方式,如果在发送响应后连接将保持活跃,考虑也包括一个单独的响应头,以通知连接的客户端何时超时,如果客户端在超时结束之前不重新使用,则关闭。(然后确保在服务器代码中实际实现该超时)。例如:

Connection: keep-alive
Keep-Alive: timeout=300
为什么浏览器在每个头上都发送“保持活动”选项

因为它是按请求的功能。任何请求都可以请求保持连接活动,服务器每次都必须确认它。一旦连接关闭,它就消失了

客户端发送另一个connect()请求以创建新的连接以发送下一个请求

如果要向HTTP 1.0/1.1请求发送HTTP 1.0响应:

  • 默认行为是
    Connection:close
    ,除非发送了
    Connection:keep-alive
    响应头(如果客户端发送了
    Connection:keep-alive
    请求头,则只有
    ),否则客户端将别无选择,只能关闭连接并每次创建一个新的连接
如果要向HTTP 1.1请求发送HTTP 1.1响应:

  • 默认行为是
    Connection:keep alive
    ,除非发送了
    Connection:close
    响应头,所以请确保您没有发送该响应头,除非客户端发送了
    Connection:close
    请求头,或者您有意关闭连接

无论哪种方式,如果在发送响应后连接将保持活跃,考虑也包括一个单独的响应头,以通知连接的客户端何时超时,如果客户端在超时结束之前不重新使用,则关闭。(然后确保在服务器代码中实际实现该超时)。例如:

Connection: keep-alive
Keep-Alive: timeout=300
为什么浏览器在每个头上都发送“保持活动”选项


因为它是每请求一次的功能。任何请求都可以请求保持连接的活动状态,服务器每次都必须确认。一旦连接关闭,它就会消失。

确保所有响应都具有
内容长度:
或使用分块编码,以便客户端可以知道响应何时完成而不需要waiting等待您关闭连接。客户端可能会打开多个连接,以便他们可以同时下载多个项目。例如,当它下载HTML主页时,如果它看到
,它将打开另一个连接,同时下载,而不是等到它下载完所有HTML。请确保您已完成所有操作r响应要么具有
内容长度:
,要么使用分块编码,这样客户端就可以在不等待您关闭连接的情况下判断响应何时完成。客户端可以打开多个连接,以便同时下载多个项目。例如,在下载HTML主页面时,如果它看到
它将同时打开另一个连接来下载,而不是等待下载完所有HTML。