升压ASIO阅读未知数量的字节(Boost asio read an unknown number

2019-09-18 20:17发布

我有两种情况:

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

我将永远不会在第二种情况适当的服务器reposonse。

但是,如果我看过比这个async_read操作至少1个字节将永远不会结束。

那么,如何处理这个情况?

更新1:我还在寻找解决方案,而无需使用时间限制。

Answer 1:

你怎么能指望这个工作? 是否响应所述第一和第二壳体之间改变? 如果它确实有所不同,你不能因为有一个竞争条件,你应该解决协议做到这一点可靠。 如果没有变化,服务器应该只发送响应。

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



Answer 2:

这里是我做过什么

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

这就是我的一小段代码我希望它可以帮助你可以读取数据的一组量,如果你喜欢它后来追加到字节的矢量并对其进行处理。

希望这可以帮助



Answer 3:

我想ü需要使用这些数据,客户端发送,以防万一2适当的服务器响应,并可能使情况1.缺省的响应因此,有关于客户端应该多久发送连接后的数据没有时间限制服务器? 也许ü应该启动一个定时器等待限时特价服务器接受连接后。 如果服务器及时接收到数据时,它的情况下2.如果时间超过,那么它的情况下,1。



文章来源: Boost asio read an unknown number of bytes