我正在编写一个简单的Web服务器,实现了HTTP 1.1协议的一些组件。目前为止,我有一个TCP服务器,可以向所有收到的TCP连接提供静态网页服务。我觉得可能会存在竞争条件或其他我不知道的事件。
以下是相关代码的要点:
char hello[] =
"HTTP/1.1 200 OK\r\n"
// "Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT\r\n"
// "Content-Length: 131\r\n"
// "Connection: close\r\n"
"\r\n"
"<html>\n"
"<head>\n"
" <title>An Example Page</title>\n"
"</head>\n"
"<body>\n"
" Hello World, this is a very simple HTML document.\n"
"</body>\n"
"</html>\n";
while(true) {
addrlen = sizeof(peer);
sockd2 = ::accept(_sockd, (sockaddr*)&peer, &addrlen);
if (sockd2 == -1) {
perror("Wrong connection");
continue;
}
write(sockd2, hello, sizeof(hello));
// close(sockd2);
}
我正在使用Google Chrome浏览器连接到localhost:8080,如上所述,页面加载得非常好。
如果我取消注释close
调用和Connection: close
行,则页面将无法加载,开发者控制台会显示Failed to load resource: net::ERR_CONNECTION_RESET
。
如果我同时取消注释其中的一个http头行,则可以正常加载。
发生了什么?
4. HTTP消息
,5. 请求
,6. 响应
和8. 连接
。我不太确定您所说的正确终止响应的含义,但现在我认为我遇到的竞争条件与在发送响应之前未读取连接有关。 - vmrob