【问题标题】:Server not receives complete requests in each read服务器在每次读取时都没有收到完整的请求
【发布时间】:2020-09-27 21:34:28
【问题描述】:

我正在尝试编写一个异步 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);
}

但结果不是我所期望的。大多数情况下,我在服务器端收到的不是完整的请求,然后是 ;.

发生的事情是这样的:

一个请求:{"Key":"Value"};{"Key":"Va

下一个请求:lue"};{"Key":"Value"};

为什么会这样?

【问题讨论】:

    标签: c++ sockets asynchronous boost-asio race-condition


    【解决方案1】:

    您需要在接收端实际实现协议。如果您没有收到完整的请求,您需要再次调用您的接收函数。套接字不理解您的应用程序协议,也不知道“请求”是什么——这是实现应用程序协议的代码的工作。

    如果您没有收到完整的请求,您需要收到更多。套接字知道什么是“完整请求”。如果这是一个完整的 JSON 对象,那么您需要实现足够的 JSON 协议来查找请求的结束位置。

    【讨论】:

    • 谢谢。因为每个请求都由 ; 分隔我可以告诉我的服务器再次读取,直到您收到完整的请求。但随着请求数量的增加,服务器越来越难以随机完成请求。
    • @H.Ebr 然后你需要编写一个解析器从套接字接收一堆数据,搜索分号,然后循环。确保保存下一次传递的剩余部分,并记住您可能会在一次读取中收到两个或更多完整的请求。实现应用程序协议是您的工作。套接字不知道请求是用分号分隔的。
    • 你应该问一个新问题。
    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 2013-10-05
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多