我有 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。