我正在使用C ++编写自己的http服务器。服务器具有绑定到端口9999
的侦听器。默认情况下,我使用带有keep-alive的HTTP 1.1。服务器使用select
来复用IO。
我的问题是,当我在localhost:9999
打开浏览器时,我看到从侦听器创建了多个套接字。第一个请求是GET / HTTP 1.1
,我的回复是index.html
文件,因此客户端可以打开它。以下是此index.html
<html lang="en" ng-app="myproject">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link rel="stylesheet" href="/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/myproject.min.css">
</head>
<script src="/js/jquery-3.2.1.min.js"></script>
<script src="/js/angular-1.2.3.min.js"></script>
<script src="/js/angular-route-1.2.3.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
....
当客户端收到此index.html
时,它会依次创建多个请求,要求bootstrap.min.css
,myproject.min.css
以及所有剩余的javascript文件(jquery-3.2.1.min.js
等)。这是我从服务器的监听器看到的:
incoming http connection created on socket 6 <-- initial request (asking '/' and `favicon`)
server sends index.html through 6
incoming http connection created on socket 7 <-- request for bootstrap.min.css
server sends bootstrap.min.css through 7
incoming http connection created on socket 8 <-- request for myproject.min.css
server sends myproject.min.css through 8
incoming http connection created on socket 9 <-- request for jquery-3.2.1.min.js
server sends jquery-3.2.1.min.js through 9
.... (sockets 6, 7, 8, 9 are alive)
客户端为每个单独的请求创建新的套接字连接对我没有任何意义。我确信我在响应和请求中都打开了keep-alive
。我希望只创建一个套接字,在本例中为6
,并且以下所有请求都应重用该套接字而不是创建新套接字。我错过了什么吗?