2011-07-30 50 views
3

我一直在努力嘗試和找到我在谷歌上的答案,因爲我不知道我正在尋找的確切術語。有沒有一種方法可以在沒有while循環的計算機之間進行數據通信? C++

如果有人構建一個類似msn messenger的程序,是否有可能始終打開連接並且沒有while(true)循環?如果是這樣,有人能指出我如何實現這一目標嗎?

+0

你可以睡幾個小時,然後當你回來時看看是否有響應。 –

+4

尋找事件和回調。您可以使用for循環代替 – arunkumar

+5

。 – squinlan

回答

4

使用boost::asio庫進行套接字處理,我認爲可以在數據接收時定義回調函數。

0

你只能隱藏你的while循環(或某種類型的循環)埋在某個庫中的某個地方,或重新開始等待事件回調中的下一個IO,但是你不能完全避免它。

+0

你能解釋一下你在'事件回調中重啓等待下一個IO'是什麼意思嗎? – Paul

+0

任何IO阻塞,直到某些數據可用,然後數據在回調中處理,一旦回調完成,阻塞繼續,回調本身可能啓動,或者它可能在某種類型的循環中。非阻塞IO雖然是一個稍微不同的故事。 –

1

您想使用ACE。它有一個反應堆模式,當數據可用時會通知你。

Reactor Pattern

1

你可以有:

while(1) { 
    sleep(100); // 100 ms 
    // check if there is a message 
    // process message 
    //... 
} 

這是確定的,但在運行的線程10000S因爲線程出來的睡眠,然後檢查消息的服務器的開銷,引起上下文交換。相反,操作系統在Linux上提供了像selectepoll這樣的功能,它允許線程等待事件。

while(1) { 
    // wait for message 
    // process message 
    //... 
} 

使用等待,線程不會被「喚醒」,除非收到一條消息。

3

您要找的單個單詞是異步I/O。這可以通過使用異步API(ReadThis()等函數立即返回並在成功/失敗時發出信號 - 例如但不限於boost :: asio)或將阻塞調用推遲到不同線程來實現。選擇任何一種方法都需要仔細權衡操作的基礎實施和規模。

0

這是一個很好的問題。像nj說的,你想使用異步I/O。太多的程序使用輪詢策略。在系統上運行1000個線程並不罕見。如果他們都在輪詢,你的系統會很慢。儘可能使用異步I/O。

0

udp協議通信怎麼樣?你不必在每個客戶端的while循環中等待 只需在指定端口上打開一個連接並調用接收方法

相關問題