2017-09-23 85 views
0

首先,我想說我是Boost asio的新人,我看到很多例子,但它仍然是我不明白的東西。Boost asio - 同步寫入/讀取 - 如何操作?

我想創建一個服務器,它將接受兩個客戶端(它將使用兩個套接字)。第一個客戶端會發送消息到服務器,服務器會將這個消息發送給另一個客戶端(是的,使用服務器是沒用的,但這不是重點,我想了解所有這些工作)。這將發生,直到其中一個客戶關閉。

所以,我創建了一個服務器,服務器等待客戶端,然後,它必須等待第一個客戶端發送一些消息。這是我的問題:我必須做什麼?

我想我需要讀第一個套接字,然後寫在第二個,等等,但我怎麼知道第一個客戶端是否在套接字上寫?同樣,我怎麼知道第二個客戶端是否讀取第二個socket?

我不需要代碼,我只是想知道做到這一點的好方法。

非常感謝您的閱讀!

回答

0

當您執行async_read時,您指定了一個回調函數,只要有任何數據讀入緩衝區(您也應提供緩衝區,請檢查async_read的文檔)。分別您應該提供async_write的回叫以瞭解您的數據何時已發送。所以,從服務器的角度來看,對於'寫入'的客戶端應該執行async_read,對於'讀取'的第二個客戶端,您應該執行異步寫入。使用提供的數據流client1-> server-> client2,很難識別服務器應該讀取哪個客戶端以及哪個客戶端要寫入哪個客戶端。隨你便。例如,您可以選擇第一個連接的客戶端作爲編寫者,第二個客戶端作爲閱讀器。

您可能想從asio iostreams開始。這是異步套接字之上的高級iostream抽象。

P.S .:另外,別忘了在某處運行io_service.run()循環。因爲所有的asio回調都在該循環中執行。

+0

好吧,我明白了。但在我的情況,我可以做同步讀/寫,因爲服務器可以等待客戶端,然後當它收到的東西,發送到另一個客戶端? –

+0

你也可以使用阻塞asio :: read/asio :: write函數,但與berkley套接字相比,它不會增加很多功能,所以我認爲使用asio來阻塞io不是一個好主意。在這種情況下,我會使用傳統的伯克利插座。 –

+0

好的,非常感謝! –

相關問題