UDPを使用したクライアントサーバー通信用のWindowsアプリケーションを開発していますが、UDPはコネクションレス型であるため、クライアントがダウンするたびに、サーバーはクライアントがオフであることを認識せず、データを送信し続けます。サーバーがダウンしている場合も同様です。クライアントまたはサーバーのいずれかがダウンしているときはいつでも、相手がそれを知っていて処理できるというこの条件にどのように対応できますか。返事を待っています。
1 に答える
あなたが求めているのはUDPの範囲を超えています。これを実現するには、UDPを介して独自のプロトコルを実装する必要があります。
簡単なアイデアの1つは、キープアライブメッセージを定期的に送信することです(一方、TCPにはこの機能があります)。
次のように簡単な実装を行うことができます。
- バックグラウンドスレッドにこれらのメッセージを送信し続け、応答を待つようにします。
- 応答を受信すると、ある種のデータ構造またはファイルに稼働中のデバイスのリストを入力できます。
他のメインスレッド(または複数のスレッド)には、次の変更を加えることができます。
- データを送信する前に、送信先のクライアントがそのファイル/データ構造に存在するかどうかを確認してください。
- そうでない場合は、このクライアントをスキップしてください。
- 設定されたファイル/データ構造内の残りのすべてのクライアントについて、上記を繰り返します。
上記の実装で見られる問題の1つは、メインスレッドの観点から見たRAWハザードに類似しています。
RAWハザードについては、前述の例の代わりに次の例えを使用してください。
i1
=キープアライブメッセージを送信するバックグラウンドスレッド。i2
=データを送受信して他のタスクを実行するメインスレッド(または複数のスレッド)。- ここでのRAWの危険性は、データ構造/ファイルが更新される前に
i2
データ構造/ファイルを読み取ろうとした場合です。i1
i1
- これは(最悪の場合)、
i2
更新されたリストを取得せず、この方法でいくつかのクライアントを見逃す可能性があることを意味します。 - この損失が重大である場合は、進行中の書き込みが完了する
i1
と信号を送るようなメカニズムがある可能性があります。i2
- この損失が重大でない場合は、上記のメカニズムをスキップしてプログラムを高速化できます。
キープアライブメッセージの説明:
非常に軽量なメッセージを送信する必要があります(通常、データはありません。ヘッダー情報のみです)。このメッセージが一意であることを確認してください。別のメッセージがキープアライブメッセージとして解釈されることは望ましくありません。
このメッセージは、ブロードキャストアドレスsendto()
への呼び出しを使用して送信できます。送信が終了したら、を使用して特定のタイムアウトの応答を待ちます。recv()
すべての応答をデータ構造/ファイルに記録します。タイムアウトの期限が切れたら、スレッドをしばらくスリープ状態にします。その時間が経過したら、上記のプロセスを繰り返します。
優れた堅牢なネットワークコードの記述を開始するには、Beejのネットワークプログラミングガイドを参照してください。それは絶対に素晴らしいです。それは多くの概念を説明しています。