2011-04-21 105 views
3

停止我有一些問題與升壓:: ASIO :: async_read的boost ::支持ASIO :: async_read沒有條件

這裏是我的代碼

void TCPConnection::listenForRead() { 

    boost::asio::async_read(m_socket, 
          boost::asio::buffer(m_inbound_data), 
          boost::asio::transfer_at_least(64), 
          boost::bind(&TCPConnection::handle_read, 
             shared_from_this(), 
             boost::asio::placeholders::error) 
          ); 
} 

和這裏的處理程序:

void TCPConnection::handle_read(const boost::system::error_code& error) { 
    if (error) { 
     std::cout << "Error read: " << error.category().name() << " -- " << error.value() << std::endl; 
    } else { 

     std::string archive_data(&m_inbound_data[0], m_inbound_data.size()); 

     std::cout << "Message received: " << archive_data << std::endl; 
     listenForRead(); 
    } 
} 

隨着

std::vector<char> m_inbound_data; 

時I g等當客戶端連接在控制檯上一個無限循環:

「接收消息:」

//沒有消息的跟蹤

如果我打印的數據長度,它總是爲0。

我連接與:telnet localhost 4242

任何人都知道爲什麼?它不應該等待至少64個字符?

+0

什麼是m_inbound_data'的'類型,什麼是它的大小 – 2011-04-21 17:25:15

+0

的std ::矢量 m_inbound_data; – TheSquad 2011-04-21 18:01:10

回答

6

Boost.Asio永遠不會調整您的緩衝區大小。

當您從std::vector<char>創建緩衝區時,緩衝區的大小就是該矢量的大小。

如果您不給它一個大小,它將是一個零長度的緩衝區。

如果至少有N個字節在緩衝區中或緩衝區已滿,transfer_at_least函數返回true。在零長度緩衝區的情況下,它總是滿的,所以它總是返回true。

+0

謝謝!用char數據[64]它確實在等待。 – TheSquad 2011-04-21 19:58:05

2

要隨着dauphic的答案去:

你可以像你這樣初始化字符數組:

char data[64] 

或者,如果你仍然想使用矢量可以初始化向量到一定規模:

std::vector<char> data(64) 

      or 

std::vector<char> data; 
data.resize(64); 
相關問題