所以,Boost Asio async_read不会停止阅读?
我一直在玩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
方法不会被连续调用?
你能告诉我们“buf”是如何初始化的(什么是TERRAINPACKETSIZE)?我问,因为我想知道你是否可能处于与讨论的情况相同的状态:http://lists.boost.org/boost-users/2009/06/49370.php – 2009-10-29 12:55:33
Eric,buf是一个字符数组和TERRAINPACKETSIZE是一个持有缓冲区大小的常量 – Polaris878 2009-10-30 16:29:20
对不起,我几乎没有想法来帮助你:(我从asio文档中获取“异步回显tcp服务器”示例并对其进行了修改,以便它的会话和你在这里展示的一样(加上handle_read中的检查错误),它工作正常。我在Windows上试过,在什么平台上运行这个? – 2009-10-30 19:11:19