2011-07-30 8 views
3

私は検索しようとしている正確な用語を知らないので、私はこの試みをgoogleで試してみるのに苦労しています。whileループなしでコンピュータ間でデータをやりとりする方法はありますか? C++

誰かがmsnメッセンジャーのようなプログラムを構築していた場合、常時オープン接続とwhile(true)ループなしが可能ですか?もしそうなら、誰かがこれがどのように達成されるかの指針を教えてくれるでしょうか?

+0

あなたが戻ってくる応答がありますかどうかを確認するときは、その後、数msのために眠ることができを受けながらで待たなければいけません。 –

+4

イベントとコールバックを探します。 – arunkumar

+5

の代わりにforループを使用できます。 – squinlan

答えて

4

ソケットハンドリングのためにboost::asioライブラリを使用すると、データ受信時にコールバックを定義できると思います。

0

ライブラリ内に埋め込まれたwhileループ(または何らかのループ)を非表示にすることも、イベントコールバックで次のIO待機を再開することもできますが、完全に回避することはできません。

+0

は、あなたが「イベントコールバックの次のIO待ちを再起動」によって何を意味するか説明できますか?コールバックは、ブロッキングがコールバック自体が開始することができるか、それがループの一部のタイプであることができる継続完了すると – Paul

+0

一部のデータが使用可能になるまで任意のIOブロックは、データは、コールバックで処理されます。ノンブロッキングIOとはいえ、わずかに別の話です。 –

1

ACEを使用します。それには、データが利用可能になったときにあなたに通知するReactorパターンがあります。

Reactor Pattern

1

あなたが持っている可能性があり:

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

をこれはOKですが、スレッドがスリープ状態から出てくると、コンテキストを引き起こして、メッセージを確認するため、スレッドの10,000秒を実行しているサーバー上のオーバーヘッドがありますスイッチング。代わりに、オペレーティングシステムはLinux上でselectepollのような機能を提供します。これによりスレッドはイベントを待つことができます。

待機を使用すると、メッセージを受信しない限り、スレッドは「起きていません」。

3

探している単一の魔法の言葉は、非同期I/Oです。これは、非同期API(readThis()などの関数)を使用するか、boost :: asioのように成功/失敗のシグナルを送信するか、別のスレッドにブロッキング呼び出しを延期することによって実現できます。どちらの方法を選ぶにしても、基本的な実装と操作のスケールの両方を慎重に検討する必要があります。

0

これはすばらしい質問です。 njと同様に、非同期I/Oを使用したいと考えています。ポーリング戦略を使用するプログラムが多すぎます。システム上で1000のスレッドを実行することは珍しいことではありません。それらのすべてがポーリングしていれば、システムが遅くなります。可能であれば、非同期I/Oを使用してください。

0

udpプロトコル通信はどうですか?あなたは、すべてのクライアント だけ開いて指定した1つのポートで接続し、呼び出すためのループが方法

関連する問題