HTTP响应连接重置?

时间:2014-05-29 02:18:20

标签: c++ sockets http tcp

我正在编写一个简单的Web服务器来实现http 1.1协议的选择组件,到目前为止,我有一个tcp服务器,它为它接收的所有tcp连接提供静态Web页面。我觉得可能会出现竞争状况或其他一些我不知道的事件。

以下是相关代码的精髓:

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标题行,则会加载。

发生了什么?

1 个答案:

答案 0 :(得分:3)

没有竞争条件&#39;这里。这是 网络错误。

问题是您没有正在阅读请求没有正确终止响应。

当浏览器写入您已关闭的连接时,您的结束会发出TCP RST,即“重置连接”。

阅读请求。您必须关闭套接字或发送内容长度标头。

您需要阅读HTTP 1.1 RFC。它似乎并不像你想象的那样微不足道。