2011-03-10 121 views
0

我正在用Boost編寫服務器,非常簡單 - 接受XML消息,處理,回覆。但是我在告訴它什麼時候停止閱讀時遇到了麻煩。boost :: asio :: async_read texutal停止條件?

這就是我現在所擁有的:(_index是到其中的數據讀入的緩衝區)

std::size_t tcp_connection::completion_condition(const boost::system::error_code& error, 
std::size_t bytes_transferred) 
{ 
    int ret = -1; 
    std::istream is(&_index); 
    std::string s; 
    is >> s; 

    if (s.find("</end_tag>") != std::string.npos) ret = 0; 
    return ret; 
} 


void tcp_connection::start() 
{ 
    // Get index from server 
    boost::asio::async_read(_socket, _index, &(tcp_connection::completion_condition), 
     boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

這並不編譯,因爲我必須定義completion_condition靜態通過它來async_read ;我無法將_index定義爲靜態的,因爲(顯然)我需要它是針對該類的。

有沒有其他的方法給參數completion_condition?我如何才能識別結束標籤並調用閱讀處理程序?

回答

2

您可以將指針傳遞給成員函數。使用C++進行處理的語法非常棘手,但boost::bind將其隱藏起來並使其相當容易。

一個例子是使completion_condition非靜態並將它傳遞給async_read這樣:boost::bind(&tcp_connection::completion_condition, this, _1, _2)

&tcp_connection::completion_condition是指向功能。 this是調用該函數的tcp_connection類型的對象。 _1_2是佔位符;它們將被函數調用的兩個參數替換。

相關問題