Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ HTTP响应连接重置?_C++_Sockets_Http_Tcp - Fatal编程技术网

C++ HTTP响应连接重置?

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"

我正在编写一个简单的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);
}
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中,必须以以下方式之一对响应进行分隔。