我正在为我的课程创作一个非常简单的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个客户端(我的服务器是多线程的),则第二个连接不会显示为新的。这只会在我回复它们时发生(很奇怪?)。如果我没有回复,我的服务器会将它们视为单独的连接。
答案 0 :(得分:2)
客户端可能要求HTTP保持连接,即在接收到当前请求的响应之后,TCP连接应保持打开以进行进一步的请求。默认情况下,所有当前浏览器都使用HTTP keep-alive。
您的回复同意这种保持活力。这意味着客户端不会立即关闭连接,因为您同意保持连接打开以进一步请求。
您的选择是:
Connection: close
作为HTTP标头而不是当前Connection: keep-alive
来关闭连接。请注意,在编写自己的HTTP服务器时,实际上建议您理解HTTP标准。在查看一些示例请求时,HTTP比您想象的更复杂。要研究标准开始here。