Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Sockets_Http_Server_Rfc - Fatal编程技术网

C 为什么我的HTTP服务器不知道客户端何时断开了连接?

C 为什么我的HTTP服务器不知道客户端何时断开了连接?,c,sockets,http,server,rfc,C,Sockets,Http,Server,Rfc,我正在为我的课程作业创建一个非常简单的http服务器 它将适当地处理GET和HEAD请求 到目前为止,我的服务器看到客户端连接,并向每个客户端发送相同的响应(有意的,用于测试) 如果我没有给客户端一个响应(并让web浏览器继续加载),然后关闭web浏览器(页面正在加载),我的服务器会看到客户端断开了连接 但是,当我向他们发送响应时(这只是一个状态行、2或3个标题字段,以及一些为网页提供标题的html),他们成功地显示了网页(现在只是标题,如预期的那样),但是当我关闭web浏览器/选项卡时,我的服

我正在为我的课程作业创建一个非常简单的http服务器

它将适当地处理GET和HEAD请求

到目前为止,我的服务器看到客户端连接,并向每个客户端发送相同的响应(有意的,用于测试)

如果我没有给客户端一个响应(并让web浏览器继续加载),然后关闭web浏览器(页面正在加载),我的服务器会看到客户端断开了连接

但是,当我向他们发送响应时(这只是一个状态行、2或3个标题字段,以及一些为网页提供标题的html),他们成功地显示了网页(现在只是标题,如预期的那样),但是当我关闭web浏览器/选项卡时,我的服务器不再看到他们断开连接

以下是我发送给所有客户的回复:

char resp[]=“HTTP/1.1 200确定\r\n内容类型:text/html\r\n内容长度:53\r\n连接:保持活动\r\n\r\n乌干达的服务器\0”

注意:我将strlen(resp)字节写入套接字,即不将最后的零字节写入套接字


另一个注意事项:我刚才测试时注意到的另一点是,如果我一个接一个地连接两个客户端(我的服务器是多线程的),第二个连接就不会显示为新的连接。这只发生在我回应他们的时候(奇怪?)。如果我没有响应,我的服务器会将它们视为单独的连接。

客户端可能要求HTTP保持活动连接,即在接收到当前请求的响应后,TCP连接应保持打开状态,以便进一步请求。默认情况下,所有当前浏览器都使用HTTP保持活动状态

你的回答同意这个保持活力。这意味着客户端不会立即关闭连接,因为您已同意保持连接打开以供进一步请求

你的选择是:

  • 自己关闭与客户端的TCP连接
  • 通过将
    connection:close
    作为HTTP头而不是当前的
    connection:keep-alive发送,请求客户端关闭连接

请注意,在编写自己的HTTP服务器时,实际上建议您了解HTTP标准。HTTP比您在查看一些示例请求时想象的要复杂得多。学习标准开始。

你告诉客户通过发送
连接:保持联系(
:)来保持联系,请阅读-总结是,这不是一种向志愿者致意的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中。您知道为什么服务器在收到响应后连接时认为客户端是相同的吗?看到我的“另一张便条”@toastedDeli:我不知道你的代码,所以我只能猜测发生了什么。如果这两个“2个客户端”实际上是同一个浏览器,则浏览器正在重用现有连接。但只有在没有可能解释您所看到内容的未完成响应的情况下,连接才能重新使用。因此保持活动实际上会使浏览器保持连接一段时间,即使在关闭了连接到我的服务器的选项卡之后?@ToastedEli:这就是HTTP保持活动的目的:通过保持与服务器的TCP连接打开以接收更多请求来降低请求的成本,因为建立新的TCP连接需要时间。同样,您应该更仔细地查看标准,而不是猜测行为。这就是标准的目的。@toastedeli-大多数浏览器在不同的选项卡之间共享HTTP连接(HTTP/2和HTTP/1.1)。这种“全局服务器连接”允许不同的选项卡重用现有连接并加快速度。这通常会提高性能,因为建立新连接“昂贵”,并且TCP/IP内置了“慢启动”功能,使连接速度在第一次建立时变慢(该功能旨在最大限度地减少丢失的数据包)。