服务器在每次读取时都没有收到完整的请求
Server not receives complete requests in each read
我正在尝试编写一个异步 tcp 客户端(客户端应该能够在不等待先前操作结果到达的情况下写入套接字)。
std::future<void> AsyncClient::SomeMethod(sometype& parameter)
{
return std::async(
std::launch::async,
[&]()
{
// Gonna send a json. ';' at the end of a json separates the requests.
const std::string requestJson = Serializer::ArraySumRequest(numbers) + ';';
boost::system::error_code err;
write(requestJson, err);
写入方法:
void AsyncClient::write(const std::string& strToWrite, boost::system::error_code& err)
{
// m_writeMutex is a class member I use to synchronize writing.
std::lock_guard<std::mutex> lock(m_writeMutex);
boost::asio::write(m_socket,
boost::asio::buffer(strToWrite), err);
}
但是结果不是我所期望的。大多数情况下,我在服务器端收到的不是完整的请求,后跟 ;.
发生的事情是这样的:
A request: {"Key":"Value"};{"Key":"Va
Next request: lue"};{"Key":"Value"};
为什么会这样?
您需要在接收端实际执行该协议。如果您没有收到完整的请求,则需要再次调用您的接收函数。套接字不了解您的应用程序协议,也不知道“请求”是什么——这是实现应用程序协议的代码的工作。
如果您还没有收到完整的请求,您需要收到更多。套接字知道什么是“完整请求”。如果这是一个完整的 JSON 对象,那么您需要实施足够的 JSON 协议来查找请求的结尾位置。
我正在尝试编写一个异步 tcp 客户端(客户端应该能够在不等待先前操作结果到达的情况下写入套接字)。
std::future<void> AsyncClient::SomeMethod(sometype& parameter)
{
return std::async(
std::launch::async,
[&]()
{
// Gonna send a json. ';' at the end of a json separates the requests.
const std::string requestJson = Serializer::ArraySumRequest(numbers) + ';';
boost::system::error_code err;
write(requestJson, err);
写入方法:
void AsyncClient::write(const std::string& strToWrite, boost::system::error_code& err)
{
// m_writeMutex is a class member I use to synchronize writing.
std::lock_guard<std::mutex> lock(m_writeMutex);
boost::asio::write(m_socket,
boost::asio::buffer(strToWrite), err);
}
但是结果不是我所期望的。大多数情况下,我在服务器端收到的不是完整的请求,后跟 ;.
发生的事情是这样的:
A request:
{"Key":"Value"};{"Key":"Va
Next request:
lue"};{"Key":"Value"};
为什么会这样?
您需要在接收端实际执行该协议。如果您没有收到完整的请求,则需要再次调用您的接收函数。套接字不了解您的应用程序协议,也不知道“请求”是什么——这是实现应用程序协议的代码的工作。
如果您还没有收到完整的请求,您需要收到更多。套接字知道什么是“完整请求”。如果这是一个完整的 JSON 对象,那么您需要实施足够的 JSON 协议来查找请求的结尾位置。