gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:33:59 24 4
gpt4 key购买 nike

我正在编写一个简单的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com