提升 asio 读取未知数量的字节



我有 2 种情况:

  1. 客户端连接,不发送字节并等待服务器响应。
  2. 客户端连接,发送超过 1 个字节并等待服务器响应。

接下来的问题是:在第一种情况下,我应该不读取字节并获得一些服务器响应。在第两种情况下,我应该至少读取 1 个字节,然后我才会得到服务器响应。如果我尝试读取至少 0 个字节,如下所示:

async_read(sock, boost::asio::buffer(data),
            boost::asio::transfer_at_least(0),
            boost::bind(&server::read, this,
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));

在第二种情况下,我永远不会得到正确的服务器存储库。

但是,如果我读取至少 1 个字节,那么async_read操作将永远不会结束。

那么,我该如何处理这种情况呢?

更新 1:我仍在不使用时间限制的情况下寻找解决方案。

你期望它如何工作?第一种情况和第二种情况的响应是否不同?如果它确实有所不同,则无法可靠地执行此操作,因为存在争用条件,您应该修复协议。如果它没有变化,服务器应该只发送响应。

这个问题的解决方案不是 asio 问题。

这是我所做的

 while (ec != boost::asio::error::eof) {
        vector<char>socketBuffer(messageSize);
        size_t buffersize = socket->read_some(
                                    boost::asio::buffer(socketBuffer),ec);
        if (buffersize > 0) {
            cout << "received" << endl;
            for (unsigned int i=0; i < buffersize; ++i) {
                cout << socketBuffer.at(i);
            }
            cout << "" << endl;
        }
        socketBuffer.clear();
    }
    if(!ec){
        cout<<"error "<<ec.message()<<endl;
    }
    socket->close();

这是我代码的一小段,我希望它可以帮助您读取一定数量的数据并将其附加到字节向量(如果您愿意)并在以后处理它。

希望这有帮助

我想您需要使用客户端发送的数据在情况 2 中做出正确的服务器响应,并在情况 1 中做出默认响应。所以客户端在连接服务器后应该发送数据多长时间没有时间限制?也许你应该启动一个计时器,等待服务器接受连接后的特殊有限时间。如果服务器及时收到数据,则为情况 2。如果时间结束了,那么情况 1。

最新更新