所以,
我一直在使用Boost asio函数和套接字(特别是异步读/写)。现在,我认为boost::asio::async_read
仅在从网络连接进入新缓冲区时才调用处理程序...但是它不会停止读取相同的缓冲区,因此不断调用处理程序。我已经能够通过检查传输的字节数来缓解它,但它基本上处于一个浪费CPU循环的忙等待循环中。
这就是我所拥有的:
class tcp_connection : : public boost::enable_shared_from_this<tcp_connection>
{
public:
// other functions here
void start()
{
boost::asio::async_read(socket_, boost::asio::buffer(buf, TERRAINPACKETSIZE),
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
private:
const unsigned int TERRAINPACKETSIZE = 128;
char buf[TERRAINPACKETSIZE];
void handle_read(const boost::system::error_code& error, size_t bytesT)
{
if (bytesT > 0)
{
// Do the packet handling stuff here
}
boost::asio::async_read(socket_, boost::asio::buffer(buf, TERRAINPACKETSIZE),
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
};
有些内容被删除,但基本上会创建一个新连接,然后调用start()
。有没有我遗漏的东西,以致handle_read
方法不会被连续调用?
答案 0 :(得分:6)
猜测:您是否在error
中查看了handle_read
?如果套接字由于某种原因处于错误状态,我想从async_read
发出的对handle_read
的嵌套调用将立即“完成”,从而立即调用handle_read
答案 1 :(得分:0)
我遇到了同样的问题。就我而言,我正在阅读这样的std :: vector:
boost::asio::async_read(socket_,
st::asio::buffer(*message,message->size()),
boost::bind(
&ActiveSocketServerSession::handleFixLengthRead,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
);
我有一个自适应向量,用于接受变量字节数
std::vector<unsigned char>* message;
message = new std::vector<unsigned char> (sizePacket);
当我收到第一个数据包时,一切正常,但在第一个数据包之后,永远不会停止解锁没有数据的handle_reader。
我的解决方案是删除我的矢量并在处理后再次分配空间:
void ActiveSocketServerSession::handleFixLengthRead( const boost::system::error_code& error,
std::size_t bytes_transferred){
--> processing your data (save to another site)
--> delete message;
--> message = new std::vector<unsigned char> (sizePacket);
//starting to read again
boost::asio::async_read(socket_,
boost::asio::buffer(*message,message->size()),
boost::bind(
&ActiveSocketServerSession::handleFixLengthRead,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
);
}else{
logMessage.str("");
logMessage << "Error handling data id: "<<getId()<< "from port";
}
}
我发现此解决方案正在阅读this
把这两行都搞定了。