27

クライアントがWindowsMo​​bile6デバイス上にあり、C ++で記述されており、サーバーが完全なWindows上にあり、C#で記述されているクライアントサーバーアプリがあります。

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

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

4

4 に答える 4

9

クライアントがいつでも出入りできるクライアント サーバー モデルのアプリケーションを作成する必要があったとき (モバイル デバイスを使用するアプリケーションの場合も同様だと思います)、クライアントがオンラインメッセージを送信するようにしました。サーバーに接続され、必要なことを実行する準備ができていることを示します。

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

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

于 2008-08-04T14:30:12.223 に答える
8

非同期通信はシングルスレッドで全然可能!

リアクタ パターン (この本を参照)と呼ばれる、ネットワーク ソフトウェア開発における一般的な設計パターンがあります。一部のよく知られているネットワーク ライブラリでは、このパターンの実装が提供されています ( ACE を参照)。

簡単に言うと、reactor はオブジェクトです。すべてのソケットを内部に登録し、何かを待ちます。何かが起こった場合 (新しいデータの到着、接続の切断など) は、reactor から通知されます。そしてもちろん、非同期でデータを送受信するために使用できるソケットは 1 つだけです。

于 2008-08-17T13:53:04.733 に答える
4

非同期ビットをC#のサーバーに追加するのか、C++のクライアントに追加するのかがわかりません。

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

Windows Mobileプラットフォームがこれらの機能をサポートしているかどうかはわかりません。そのため、さらに掘り下げる必要があるかもしれません。

于 2008-08-05T05:30:41.297 に答える
4

asioをチェックしてください。これは、非同期 IO 用の相互互換性のある C++ ライブラリです。これがサーバーにとって役立つかどうかはわかりませんが (標準の c++ DLL を ac# プロジェクトにリンクしようとしたことはありません)、クライアントにとっては役立つでしょう。

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

于 2008-08-11T10:00:06.437 に答える