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

时间:2017-10-22 20:40:58

标签: c sockets http server rfc

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

它会适当地处理GET和HEAD请求。

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

如果我没有给客户提供响应(并保持Web浏览器加载),然后关闭Web浏览器(当页面加载时),我的服务器就会看到客户端断开连接。

然而,当我向他们发送响应时(这只是一个状态行,2或3个标题字段,以及一些html为网页提供标题),他们成功显示了网页(现在只是标题) (按照预期),当我关闭网络浏览器/标签时,我的服务器不会再看到它们断开连接。

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

char resp[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 53\r\nConnection: keep-alive\r\n\r\n<html><head><title>Dan's Server</title></head></html>\0";

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

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

1 个答案:

答案 0 :(得分:2)

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

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

您的选择是:

  • 自己关闭与客户端的TCP连接
  • 要求客户端通过发送Connection: close作为HTTP标头而不是当前Connection: keep-alive来关闭连接。

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