2008-08-04 31 views
20

私は、クライアントがWindows Mobile 6デバイス上にあり、C++で書かれたサーバがWindows上にあり、C#で書かれているクライアントサーバアプリケーションを持っています。同じオープンソケット上の非同期マルチ方向サーバー - クライアント通信?

元々、クライアントからサーバーにメッセージを送信する必要があり、サーバーはメッセージを受信した肯定応答を返すだけでした。今、私はそれを更新して、サーバーが実際にデータを要求するためにクライアントにメッセージを送ることができるようにしたいと思います。私は現在、サーバーにデータを送信した後にクライアントが受信モードになるようにセットアップしているため、サーバーはいつでも要求を送信できません。私はクライアントデータを待つ必要があります。私の最初の考えは、別のオープンソケットでクライアントに別のスレッドを作成し、サーバーの要求をリッスンすることです...サーバーがすでにクライアントを尊重しているようにします。同じスレッド内で同じソケットを使用して、すべてのサーバーにいつでもリクエストを送信する方法はありますか?

WaitForMultipleObjects()の影響を受けるものを使用して、受信バッファと送信するデータがあることを通知するイベントを渡すことはできますか?

答えて

7

クライアントが必要なときにクライアントを残して入力できるクライアント/サーバーモデルをアプリケーションに書く必要があるとき(モバイルデバイスを使用しているときにアプリケーションの場合もそうだと思います)、クライアントオンラインメッセージをサーバーに送信します。これは、サーバーが接続され、必要な処理を実行できる状態であることを示しています。

その時点で、サーバーは同じオープン接続を介してクライアントにメッセージを送り返すことができました。

また、該当するかどうかわかりませんが、ハートビートクライアントがサーバーに送信して、まだオンラインであることを知らせていました。このようにして、サーバーはクライアントがネットワークから強制的に切断されたことを知り、そのクライアントをオフラインとしてマークすることができます。

3

C#のサーバーまたはC++のクライアントに非同期ビットを追加するかどうかは不明です。

C++でこれを行う場合、デスクトップWindowsプラットフォームは、重複したI/Oを使用するAPIを介して非同期にソケットI/Oを実行できます。ソケットの場合、WSASend、WSARecvはどちらも非同期I/Oを許可します(I/Oが完了したときに設定されるイベントを設定できるLPOVERLAPPEDパラメータのドキュメントを参照してください)。

Windows Mobileプラットフォームでこれらの機能がサポートされているかどうかわからないので、追加の掘り下げが必要な場合があります。

3

asioをご覧ください。これは非同期IO用の相互互換性のあるC++ライブラリです。私はこれがサーバー(私は標準のC++ DLLをC#プロジェクトにリンクしようとしたことはありません)にとっては有用かどうかは分かりませんが、クライアントにとっては便利です。

私たちのアプリケーションで使用し、私たちのIO同時処理の問題のほとんどを解決しました。

7

シングルスレッドで非同期通信を完全に使用できます!

ネットワークソフトウェア開発には、リアクタパターン(look at this book)と呼ばれる共通の設計パターンがあります。いくつかのよく知られているネットワークライブラリは、このパターン(look at ACE)の実装を提供します。

簡単に言えば、反応炉は物体であり、内部にすべてのソケットを登録して何かを待つ。何かが起きた場合(新しいデータが到着した場合、接続が閉じる...)、原子炉があなたに通知します。もちろん、非同期にデータを送受信するソケットは1つだけ使用できます。

関連する問題