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

Why does my HTTP server not know when the clients have disconnected?

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

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

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

如果我不给客户端响应(并让网络浏览器加载),然后关闭网络浏览器(在页面加载时),我的服务器会发现客户端已断开连接。

然而,当我向他们发送回复时(这只是一个状态行,2 或 3 个 header 字段,以及一些 html 给网页一个标题),他们成功了显示网页(现在只是标题,如预期的那样),但是当我关闭网络时我的服务器不再看到它们断开连接browser/tab。

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

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>[=10=]";

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

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

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

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

您的选择是:

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

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