【问题标题】:HTTP response connection reset?HTTP响应连接重置?
【发布时间】: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 标题行之一,它会加载。

发生了什么事?

【问题讨论】:

    标签: c++ sockets http tcp


    【解决方案1】:

    这里没有“竞争条件”。这是一个网络错误。

    问题在于您没有读取请求并且没有正确终止响应。

    当浏览器写入您已经关闭的连接时,您的终端会发出一个 TCP RST,即“连接重置”。

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

    您需要阅读 HTTP 1.1 RFC。它并不像你想象的那么简单。

    【讨论】:

    • 我没有阅读整个 RFC,但阅读了我认为的相关部分:4. HTTP Message5. Request6. Response8. Connections。我不太确定您正确终止响应是什么意思,但我现在认为我遇到的竞争条件与 在发送响应之前未读取连接有关。
    • 我的意思是关闭连接或发送内容长度标头(或使用分块编码)。在 HTTP 1.1 中,必须以其中一种方式分隔响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2016-02-02
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2014-09-27
    • 2013-10-17
    相关资源
    最近更新 更多