1

我有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:我仍在寻找不使用时间限制的解决方案。

4

3 回答 3

3

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

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

于 2012-07-01T13:56:55.747 回答
1

这就是我所做的

 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();

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

希望这可以帮助

于 2012-07-27T11:38:36.713 回答
0

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

于 2012-07-01T04:51:56.947 回答