1

私たちのアプリケーションには、複数のクライアントに接続するサーバーがあります。ご参考までに、これはシングル スレッド アプリケーションです。クライアントが他のクライアントにメッセージを送信したいときはいつでも、サーバーを経由します。クライアントがサーバーにメッセージを送信するたびに、メッセージはDqueue. サーバーは からメッセージを 1 つずつ抽出し、Dqueue呼び出しselect()て、メッセージが送信されるはずのチャネルが使用可能かどうかを確認します。はいの場合は送信します。そうでない場合は、他のメッセージを処理できるように後ろに挿入します。しかし、このアプローチの問題は、クライアントがC12 つのメッセージS1S2. サーバーS1が他のクライアントに送信しようとするとC2、C2 はビジーであったため、メッセージ S1 をキューの後ろにプッシュします。ここで、処理S2中にクライアントC2の準備ができたとします。サーバーは送信できるようになりますS2。しかし、これの問題は、メッセージがC2逆順 ( S2 S1) に到達することです。

同じメッセージ順序を維持できるように、これに適したデータ構造を教えてください。

4

2 に答える 2

1

すべてのメッセージを処理するために単一のキューを使用しないでください。各クライアントには、独自の個別のキューが必要です。メッセージが到着したら、宛先のクライアントを判別し、メッセージをそのクライアントのキューの最後に置きます。次に、サーバー ロジックを更新して、特定のクライアントのキューの一番上のメッセージのみをそのクライアントに送信します。クライアントがビジーの場合は、トップ メッセージを送信しないでください。クライアントの準備が整ったら、トップ メッセージを送信し、そのクライアントのキューから削除します。

于 2012-04-12T20:51:52.393 に答える
0

いろいろ想定しています。つまり、あなたまたはあなたのグループの誰かがキュー マネージャーを作成するか、またはキュー マネージャーが作成したパラメーターを受け入れることができます。

皮肉なことに、これは構造体の配列が必要なように思えます。サービスを使用すると思われるクライアントの数に応じて、構造体の固定配列または割り当てられたヒープメモリのブロックになる可能性があります。クライアントの管理方法に応じて、構造体の配列で構造体へのポインターを使用するか、構造体に十分なストレージを割り当てることができます。

メッセージ送信の一部として保存するデータがわかりません。おそらく、フィールドを書き留めておけば、それが役立つでしょう。

于 2012-04-12T17:22:26.827 に答える