2009-10-28 136 views
1

所以,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方法不会被连续调用?

+1

你能告诉我们“buf”是如何初始化的(什么是TERRAINPACKETSIZE)?我问,因为我想知道你是否可能处于与讨论的情况相同的状态:http://lists.boost.org/boost-users/2009/06/49370.php – 2009-10-29 12:55:33

+0

Eric,buf是一个字符数组和TERRAINPACKETSIZE是一个持有缓冲区大小的常量 – Polaris878 2009-10-30 16:29:20

+1

对不起,我几乎没有想法来帮助你:(我从asio文档中获取“异步回显tcp服务器”示例并对其进行了修改,以便它的会话和你在这里展示的一样(加上handle_read中的检查错误),它工作正常。我在Windows上试过,在什么平台上运行这个? – 2009-10-30 19:11:19

回答

6

一个疯狂的猜测:你检查errorhandle_read?如果由于某种原因,套接字处于错误状态,我猜想从handle_read制作的async_read的嵌套调用将立即“完成”,导致立即调用handle_read

+0

我试着检查错误标志,并说没有错误:( – Polaris878 2009-10-29 01:10:48

+0

如果没有错误条件(如果(!错误)...),您应该只安排另一个async_read。 – Dan 2009-10-29 12:40:39

0

我遇到了同样的问题。就我而言,我正在读入一个std ::矢量这样的:

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。

我的解决办法是处理之后再删除我的矢量或Alloc空间:

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

把这两行一切顺利的罚款之后。

相关问题