c++ - HTTP 响应连接重置?

标签 c++ sockets http tcp

我正在编写一个简单的 web 服务器,它实现了 http 1.1 协议(protocol)的选择组件,到目前为止,我有一个 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);
}

我正在使用 Google Chrome 连接到 localhost:8080,如上所示,页面加载正常。

如果我取消注释 close 调用和 Connection: close 行,页面将不会加载,开发者控制台会显示 Failed to load resource: net::ERR_CONNECTION_RESET

如果我执行上述操作但还取消注释其他 http header 行之一,它会加载。

这是怎么回事?

最佳答案

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

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

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

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

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

关于c++ - HTTP 响应连接重置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23924738/

相关文章:

c++ - 用C++查找L1和L2缓存的大小

javascript - 在进一步执行之前等待 http.request 响应

java - Jersey 长时间运行请求超时

c++ - 为什么我找不到集合论的正确输出?

C++ 相等性测试 'Object'

c++ - 向 Qt 对象添加流运算符

c - 如何获取 select() 监视的文件描述符准备就绪的时间戳?

iphone - (iphone) 如何将密码发送到我的服务器?

java - DatagramSocket 关闭后端口仍在使用

http - Web 服务器如何知道发布给它们的表单中使用的字符集?