1

ここで非常に紛らわしい状況に陥っているため、シナリオ全体を説明します。

UDP サーバー/複数のクライアント アプリケーションを開発しました。

サーバーにはメインの受信スレッドがあります。サーバーとの通信を希望する各クライアントは、最初に ID を含むメッセージをサーバーに送信します。サーバーはクライアントからこのメッセージを受け取ります。サーバーには、許可された ID のリストを含むテキスト ファイルがあります。メッセージがクライアントから受信されると、サーバーはクライアントから受信した ID をテキスト ファイルで使用可能な ID と比較します。クライアントの ID がサーバーのテキスト ファイル内のいずれかの ID と一致する場合、そのクライアントは認証済みと見なされ、このクライアント専用の新しいスレッドと新しいソケットが作成されます。この新しいクライアントの情報は、アクティブなすべてのクライアントの情報を含むキューでも更新されます。

このタスクはすべて完了しました ここでの問題は、各クライアントが専用のスレッドを提供するため、これらのスレッドがそれぞれのクライアントにメッセージを送信し、クライアントからの応答がない場合はクライアントからの応答を待機することです。クライアントが特定の時間内に停止した場合、クライアントは停止していると見なされ、メインの受信スレッドのキューから削除されます。

しかし、問題は、「すべて」x 個のクライアントが、それぞれのクライアントが非アクティブであることをメインの受信スレッドにどのように伝えるかということです。この部分が完了した場合、メインの受信スレッドはキュー全体をトラバースし、無効になっているクライアントの情報を見つけて、これをどのように削除する必要がありますか? これは私にとって本当に混乱する状況です。

かなり時間が経ちましたが、アプリケーションでアクティブなクライアントの記録を保持できません。

至急助けてください。前もって感謝します :)

編集: 別のアイデアは、キューに x 個の要素と各クライアントの状態があるということです。例: 最初に x 個のクライアントの場合:

Client#    Status

1            0

2            0

3            0

.            .

.            .

.            .

.            .

x            0

新しいクライアントがアクティブになるたびに、ステータスが 0 から 1 に変更され、クライアントがダウンするたびに、ステータスが 1 から 0 に戻されます。

これは正しいアプローチのようですか?

4

1 に答える 1

2

Tcp を使用することをお勧めします。UDP を使用すると、自分で処理を行う必要があります。

これらのスレッドがそれぞれのクライアントにメッセージを送信し、クライアントからの応答を待ちたい

最初: Queue または List をスレッド セーフにする

クライアントアドレスに関する情報 ( client sockaddr ) や state などのその他の情報を格納する List の ID (インデックス) を渡します。スレッド内でインデックスを使用して、クライアントに関する情報を取得します。クライアント アドレスを取得すると、それにメッセージを送信できます。

この部分が完了した場合、メインの受信スレッドはキュー全体をトラバースし、無効になっているクライアントの情報を見つけて、これをどのように削除する必要がありますか? これは私にとって本当に混乱する状況です。

リストをトラバースしてクライアントのインデックスを取得し、状態を変更します。クライアントスレッドで、特定の時間内にクライアントの状態がアクティブに変更されないことがわかった場合は、そのクライアント情報をリストまたはキューから削除します。

ハッピープログラミング

于 2013-06-10T06:55:47.190 に答える