2012-11-13 29 views
0

我正在使用同步服務器和讀取無限循環的客戶端。Boost同步客戶端和服務器 - 無限循環阻塞其餘

for (;;){ 
    boost::system::error_code error; 
    read(socket,boost::asio::buffer(&abc, sizeof(abc))); 
... 
} 

什麼是最好的方式來解決其餘的程序阻塞,因爲我想用snych而不是異步。 (線程?)

THX提前..

+1

使其與輸入/輸出線程安全隊列傳達給主線程 – bobah

+0

線程每個連接@bobah作出這樣的回答 –

回答

1

使其與一個線程安全的隊列作爲一個主線程的收件箱線程每個連接。它不能擴展多個連接,但是當你不需要可擴展性時,它是最安全和最簡單的事情。寫入操作將由主線程直接進入套接字完成。讀取操作將由專用線程完成,它會將讀取的數據位累積到一個臨時緩衝區中,直到它接收到整個消息,然後它會將完整消息轉發到主線程的收件箱隊列中。 如果您需要爲多個連接提供服務或資源有限,那麼您需要在基於select()/ epoll()的事件循環(又名反應堆)中使用非阻塞IO。

+0

也許我誤解你.. 但是是不是有一個解決方案,我可以離開服務器和客戶端,因爲它們是,但當我打電話給客戶端啓動/從我的主要功能(在C++中)讀取客戶端啓動,但主功能也繼續(並行)? thx .. – ddd

+0

@ddd - 除非您執行非阻塞IO,否則無法通過單個線程讀取和執行其他操作(但在這種情況下,事情會變得複雜得多)。你要麼阻止閱讀,要麼做其他事情。這就是爲什麼你需要一個單獨的線程,它的唯一作用是始終阻止從套接字讀取數據。 – bobah

+0

好的..我只需要一個連接。程序啓動,客戶端連接並從服務器接收數據直到結束。 你會有一個例子(鏈接)如何實現它? 我也在考慮再次使用異步(也將解決我的問題,我想!?),但必須確保一切正確傳輸。 thx .. – ddd