2012-11-27 97 views
1

我正在使用boost :: asio來實現網絡編程並運行到計時問題。這個問題目前與客戶最多。Boost ASIO網絡時序問題

協議最初由服務器向用戶返回日期時間字符串開始,客戶端讀取它。直到那部分它工作正常。但是我也想要的是能夠將命令寫入服務器,然後處理它們。爲了完成這個,我使用io_service.post()函數,如下所示。

io_service.post(boost::bind()); // bounded function calls async_write() method. 

由於某種原因,寫入嘗試發生在初始客戶端/服務器通信之前,當套接字尚未創建時。我得到了錯誤的套接字描述符錯誤。

現在io_service的運行方法確實在另一個線程中調用。

當我在post方法之前放置sleep(2)命令時,它工作正常。

是否有辦法同步它,以便在執行任何發佈的調用之前創建套接字。

+4

爲什麼不叫'async_write'從讀取的完成處理程序,或任何功能,即「初始客戶端/服務器通信」後,所謂的做?看看asio的例子。 –

+0

爲什麼downvote ?.我的問題很簡單,那麼當我執行post命令時,它會在實際套接字實例設置之前執行? – Anonymous

回答

1

當創建套接字,並建立使用boost::asio的連接,你可以定義一個方法,當這些操作被稱爲無論是完成還是失敗。所以,你應該在成功回調中觸發你的「發佈呼叫」。

相關的方法和類:

boost::asio::ip::tcp::resolver::async_resolve(...) 
boost::asio::ip::tcp::socket::async_connect(...) 
+0

另一個解決方案是將你的有界函數和你的套接字創建函數發佈到同一個[strand]上(http://www.boost.org/doc/libs/1_43_0/doc/html/booster_asio/reference/io_service__strand.html ),那麼如果首先調用套接字創建函數,那麼'strand'確保它在第二個函數執行之前結束。 –