Boost asio读取的字节数未知

Boost asio读取的字节数未知,boost,asynchronous,boost-asio,Boost,Asynchronous,Boost Asio,我有两个案例: 客户端连接,不发送字节,等待服务器响应 客户端连接,发送超过1个字节并等待服务器响应 下一个问题是: 在第一种情况下,我应该不读取字节,并得到一些服务器响应。 在第二种情况下,我应该读取至少1个字节,只有这样我才能得到服务器响应。 如果我尝试读取至少0个字节,如下所示: async_read(sock, boost::asio::buffer(data), boost::asio::transfer_at_least(0), boo

我有两个案例:

  • 客户端连接,不发送字节,等待服务器响应
  • 客户端连接,发送超过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个字节,那么这个异步读取操作将永远不会结束

    那么,我如何处理这些案件呢

    更新1:
    我仍然在寻找没有时间限制的解决方案。

    我想在案例2中,您需要使用客户端发送的数据来做出正确的服务器响应,在案例1中,可能会做出默认响应。
    因此,连接服务器后,客户端发送数据的时间没有时间限制?也许你应该在服务器接受连接后启动一个计时器,等待特殊的有限时间。如果服务器及时接收到数据,则情况为2。如果时间过去了,那么就是案例1。

    我想您需要使用客户端发送的数据在案例2中做出正确的服务器响应,并且可能在案例1中做出默认响应。
    因此,连接服务器后,客户端发送数据的时间没有时间限制?也许你应该在服务器接受连接后启动一个计时器,等待特殊的有限时间。如果服务器及时接收到数据,则情况为2。如果时间过去了,那么情况1就是这样。

    你认为这会怎样?第一种和第二种情况的反应是否不同?如果它确实发生变化,您就无法可靠地执行此操作,因为存在竞争条件,您应该修复协议。如果没有变化,服务器应该只发送响应


    此问题的解决方案不是asio问题。

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

    这个问题的解决方案不是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();
    
    while(ec!=boost::asio::error::eof){
    vectorsocketBuffer(messageSize);
    size\u t buffersize=socket->read\u some(
    boost::asio::buffer(socketBuffer),ec);
    如果(缓冲区大小>0){
    这就是我所做的

     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();
    
    while(ec!=boost::asio::error::eof){
    vectorsocketBuffer(messageSize);
    size\u t buffersize=socket->read\u some(
    boost::asio::buffer(socketBuffer),ec);
    如果(缓冲区大小>0){
    
    谢谢你的回答。是的,时间限制是一种保留的解决方案。我仍在努力毫不拖延地找到解决方案。谢谢你的回答。是的,时间限制是一种保留的解决方案。我仍在努力毫不拖延地找到解决方案。是的,回答是不同的。我说的是asio,例如,创建解决方案是一种sio.如果您无法更改协议,服务器必须有一个超时来决定发送什么响应。没有时间限制的解决方案要么是假设客户端未发送任何内容的即时响应,要么是无限期等待客户端发送内容。这很愚蠢,因此您必须有一个超时。一旦有了超时,只需使用超时功能即可asio中的res。是的,响应是不同的。例如,我说的是asio,解决方案是asio。如果无法更改协议,服务器必须有一个超时来决定发送什么响应。没有时间限制的解决方案要么是假设客户端未发送任何响应的即时响应,要么是无限等待客户端发送有些东西。这很傻,所以你必须有一个超时。一旦你有一个超时,就使用asio中的超时功能。谢谢你的回复!我现在不能检查,但我会很快检查。谢谢你的回复!我现在不能检查,但我会很快检查。