2012-03-09 70 views
0

我正在使用Boost Asio編寫C++客戶端/服務器應用程序。我有一個工作服務器,服務器工作流程是我理解的很好的東西。使用Boost Asio通過TCP套接字執行異步寫入操作

我的客戶端應用程序按照Asio示例中所示的方式處理連接,然後與服務器交換握手信息。然而,在那之後,用戶應該能夠在他們想要的時間和方式上向服務器發送請求,這是我理解該範例時遇到的問題。

最初的工作流程是這樣這樣一點點:

OnConnected() { SendHandshake() } 
SendHandshake() { async.write_some(handshake...), async_read_some(&OnRead) } 
OnRead() { ReadServerHandshake() *** } 

而且,用戶將通過使用寫入發送消息(MSG):

Write (msg) { async_write_some(msg,&OnWrite), async_Read_some(&OnRead) } 
OnWrite() {} 

編輯:改寫問題更清晰,這裏是場景:

初始握手完成後,客戶端僅用於發送請求到服務器呃,它會得到答覆。因此,例如,用戶發送寫入。客戶端等待讀取操作完成,讀取回復並執行相關操作。接下來的用戶寫作只會在5分鐘後纔會出現。在此期間io_service是否會停止工作,因爲在最後一次回覆讀取和下一次寫入之間沒有未完成的異步操作?

回答

0

在信息提示中,您可以提供io_service::work以阻止io_service無法工作。這將確保io_service::run從不返回,直到工作對象被銷燬。 要控制工作對象的使用壽命,您可以使用shared_ptr指針,並在完成工作後將其重置,或者可以使用boost::optional,如here所述。

當然,您仍然需要處理服務器關閉TCP連接或連接因任何原因而死亡的情況。爲了處理這種情況,一種解決方案是在服務器的套接字上有一個優秀的async_read。當/如果連接出現問題時,應該使用error_code調用讀取處理程序。如果您在連接上有優秀的閱讀內容,則不需要使用工作對象。

+0

我會試試這個,謝謝。 – skali 2012-03-10 13:13:19

0

如果您希望IO服務完成讀取,您必須開始讀取。如果您希望在客戶端發送數據時讀取數據,則必須始終進行異步讀取操作。否則,圖書館如何知道如何處理數據?

+0

我知道我需要異步讀取未完成,如果我期待從服務器的答案。我在Write方法中這樣做。 但是,如果我完成寫入讀取循環,並且用戶想再次寫入需要一段時間,那麼io_service會在此期間終止,因爲它沒有任何工作要做? – skali 2012-03-10 13:14:13

+0

但它確實有工作要做,它是(現在仍然會)嘗試完成未完成的異步讀取請求。製作異步請求是告訴io_service做某事的方式之一。 – 2012-03-10 13:37:11

+0

我的意思是讀完後。所以我做async_read - >一旦完成了OnRead處理程序的調用,並且在其中我不會調用任何其他異步操作。在啓動下一次寫入之前,我沒有在套接字上進行突出的讀或寫操作。 io_service會停止工作嗎? – skali 2012-03-10 14:23:01