2013-01-13 97 views
1

我有一個服務器應用程序,使用boost :: asio的異步讀/寫功能與連接客戶端進行通信(直到他們斷開連接)。boost :: asio如何實現定時數據包發送功能?

到目前爲止,一切都很好,但我想實現某種定時的方法,服務器在經過一段時間後自行發送數據包。

我主要關注boost::asio website上的教程/示例,所以我的程序基本上與給出的示例具有相同的結構。

我試圖通過調用io_service.run()這樣通過創建ASIO ::期限定時器對象並將它傳遞給,我已經「援引」的io_service對象來實現此功能:

asio::deadline_timer t(*io, posix_time::seconds(200)); 
t.async_wait(boost::bind(&connection::handle_timed, 
       this, boost::asio::placeholders::error)); 

而且在handle_timed處理程序是這樣的:

void connection::handle_timed(const system::error_code& error) 
{ 
    //Ping packet is created here and gets stored in send_data 

    async_write(socket_, asio::buffer(send_data, send_length), 
       boost::bind(&connection::handle_write, this, boost::asio::placeholders::error)); 
} 

但是我有問題是deadline_timer不會等待給定的時間,他幾乎立即進入處理函數,並希望發送數據包。

這就像他一到達它即處理異步操作,那當然不是我想要的。

難道是因爲io_service.run()調用io_service對象後,我不能添加新的「對象」?或者,也許我必須特別將它包含在io_service對象的工作隊列中?

此外,我很難理解如何實現這一點,而不會混淆正常的消息流量。

+0

是否使用TCP套接字

const boost::shared_ptr<asio::deadline_timer> t(new asio::deadline_timer(*io, posix_time::seconds(200))); t.async_wait(boost::bind(&connection::handle_timed, this, boost::asio::placeholders, t)); 

和你完成處理:或者,使用boost::enable_shared_from_this並保留一份副本在你完成處理?如果是這樣,你可以考慮[保持活力](http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html)。 –

+0

是的,我正在使用TCP套接字,但我寧願發送數據包以及我通常發送的其他數據包,因爲我想在其中放入一些數據。 – user1175111

回答

1

您可以隨時將工作添加到io_service。您應該檢查你的async_wait()回調的錯誤,它看起來對我來說,你的deadline_timer超出範圍

asio::deadline_timer t(*io, posix_time::seconds(200)); 
t.async_wait(boost::bind(&connection::handle_timed, 
       this, boost::asio::placeholders::error)); 
... 
// t goes out of scope here 

你應該讓你的connection類的成員就像socket_

void connection::handle_timed(
    const system::error_code& error, 
    const boost::shared_ptr<asio::deadline_timer>& timer 
    ) 
{ 
    //Ping packet is created here and gets stored in send_data 

    async_write(socket_, asio::buffer(send_data, send_length), 
       boost::bind(&connection::handle_write, this, boost::asio::placeholders::error)); 
} 
+0

感謝您的快速回答,將deadline_timer對象添加到類中就有竅門。 – user1175111

+0

@用戶沒問題,祝你好運。如果您遇到困難,請提出其他問題。 –

相關問題