【发布时间】:2014-07-18 10:49:32
【问题描述】:
我正在编写一个简单的 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);
}
我正在使用谷歌浏览器连接到 localhost:8080,如上所述,页面加载正常。
如果我取消注释 close 调用和 Connection: close 行,页面将不会加载,而是开发者控制台读取 Failed to load resource: net::ERR_CONNECTION_RESET。
如果我执行上述操作但还取消注释其他 http 标题行之一,它会加载。
发生了什么事?
【问题讨论】: