首页 文章

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

提问于
浏览
-1

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

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

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

如果我不给客户一个响应(并保持Web浏览器加载),然后关闭Web浏览器(当页面加载时),我的服务器看到客户端断开连接 .

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

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

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(我的服务器是多线程的),第二个连接不会显示为新的 . 这只会在我回复它们时发生(很奇怪?) . 如果我没有回应,我的服务器将它们视为单独的连接 .

1 回答

  • 2

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

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

    你的选择是:

    • 自己关闭与客户端的TCP连接

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

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

相关问题