Qt 服务器响应中的HTTP内容长度不正确会导致客户端出现不同的结果

Qt 服务器响应中的HTTP内容长度不正确会导致客户端出现不同的结果,qt,http,boost-asio,mime-types,asyncsocket,Qt,Http,Boost Asio,Mime Types,Asyncsocket,服务器 我有一个基于Boost::Asio的http WebService,它异步处理客户端连接,并使用前面带有http头的JSON内容进行回复: std::string response += "HTTP/1.0 200 OK\r\n"; response += "Content-Length: 2000\r\n"; response += "Content-Type: application/json\r\n"; response += "Connection: close\

服务器

我有一个基于Boost::Asio的http WebService,它异步处理客户端连接,并使用前面带有http头的JSON内容进行回复:

std::string response += "HTTP/1.0 200 OK\r\n";
response += "Content-Length: 2000\r\n";        
response += "Content-Type: application/json\r\n";
response += "Connection: close\r\n";
response += "\r\n";
response += meassageBody;
其中messageBody是大小不大于500的JSON结构

每次-在将响应发送回客户端之后-我调用下面的序列以关闭(我相信)套接字:

m_oSocket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
m_oSocket.close();
客户端

为了测试服务器,我在Qt中编写了一个小型客户端应用程序,它向服务器请求内容,并显示是否返回了任何错误

如果服务器在http头中使用“Content Length”值进行回复:

  • 硬编码(如上面的示例所示为2000),然后Qt客户端显示错误代码2,表示“连接已关闭”

  • 设置为适当的JSON数据大小(通常为400-500),然后Qt客户端显示错误代码0,表示“未知错误”

问题:

  • 在http头中发送不正确的“内容长度”值是否会对连接的终止方式产生影响

  • 我认为关闭服务器端的套接字可以使连接在客户端也被视为关闭。如何同时完成这两个任务:发送适当的“内容长度”值,并在客户端显示“连接已关闭”状态


  • 感谢内容长度标题必须与内容的字节数完全一致,不能多,也不能少。如果不是,从客户的角度来看,结果是不可预测的


    由于您使用的是HTTP 1.0,因此不应在服务器上关闭连接(也不应发送
    连接:close
    标头。客户端在读取数据后将关闭连接。

    感谢您的回复。在阅读了有关HTTP 1.0和1.1的其他内容后,现在一切都清楚多了。