C++ HTTP响应连接重置?
我正在编写一个简单的web服务器,它实现http 1.1协议的部分组件,到目前为止,我有一个tcp服务器,它为它接收的所有tcp连接提供一个静态网页。我觉得可能有一个比赛条件或一些其他事件发生,我不知道 以下是有关代码的要点:C++ HTTP响应连接重置?,c++,sockets,http,tcp,C++,Sockets,Http,Tcp,我正在编写一个简单的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"
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);
}
charhello[]=
“HTTP/1.1 200正常\r\n”
//上次修改:2003年1月8日星期三23:11:55 GMT\r\n
//“内容长度:131\r\n”
//“连接:关闭\r\n”
“\r\n”
“\n”
“\n”
“示例页\n”
“\n”
“\n”
“你好,世界,这是一个非常简单的HTML文档。\n”
“\n”
“\n”;
while(true){
addrlen=sizeof(对等);
sockd2=::接受(_sockd,(sockaddr*)和对等,&addrlen);
如果(sockd2==-1){
perror(“错误连接”);
继续;
}
写(sockd2,你好,sizeof(你好));
//关闭(D2);
}
我使用Google Chrome连接到localhost:8080,如上所述,页面加载很好
如果我取消注释close
调用和Connection:close
行,页面将不会加载,而是开发人员控制台读取加载资源失败:net::ERR\u Connection\u RESET
如果我执行了上述操作,但同时取消了对其他http头行之一的注释,则会加载
发生了什么事?这里没有“比赛条件”。这是一个网络错误。 问题是您没有读取请求,也没有正确终止响应 当浏览器写入您已经关闭的连接时,您的终端会发出TCP RST,即“连接重置” 阅读请求。您必须关闭套接字或发送内容长度头
您需要阅读HTTP 1.1 RFC。这并不像你想象的那么琐碎。我没有阅读整个RFC,而是阅读了我认为相关的部分:
4。HTTP消息
,5。请求
,6。响应
和8。连接
。我真的不确定正确终止响应是什么意思,但我现在认为我遇到的竞争条件与发送响应之前不读取连接有关。我的意思是关闭连接或发送内容长度头(或使用分块编码)。在HTTP 1.1中,必须以以下方式之一对响应进行分隔。