1

QTcpSockets と QThreads でこの問題に数日間苦労しています。

ポートをリッスンし、nextPendingConnection() を使用して新しいクライアントを作成する QTcpServer があります。これで、クライアントには読み取りと書き込みに使用できる qtcpsocket ができました。

サーバーに 100 のクライアントが接続されているとします。それらの 1 つが全員にメッセージをブロードキャストしたい場合、私のメイン スレッド ( nextPendingConnection() でクライアントを作成する場所) は、100 を超えるクライアントを反復処理し、ソケットで書き込みメソッドを呼び出す必要があります。たとえば、10 人のユーザーが同時にブロードキャストする場合、1000 回の反復を行う必要があるため、クライアント側 (ユーザーがメッセージを受信するとき) に遅延が生じると考えられます。

データを並列で送信できるように、すべてのソケット書き込みを別々のスレッドで行いたいと思います。ソケットが作成されたスレッドから別のスレッドからソケットを呼び出すことはできないことを知っています。多くのスレッドを持つことが良い考えかどうかわからないため、クライアントごとに 1 つのスレッドを使用したくありません。 (さらに、クライアントが切断しない限り、これらのスレッドは常に実行されている必要があります)。

スレッド フォーチュン サーバーの例を読みましたが、データの送信後にソケットが破棄されるため、問題の解決にはなりません。受信メッセージをリッスンする必要があるため(ブロードキャストできるようにするため)、ソケットを破壊したくありません。

私が考えたことの 1 つは、各クライアント (サーバー側とクライアント側) に 2 つのソケットを用意することです。1 つのソケットを読み取り用に保持し、もう 1 つのソケットをスレッド フォーチュン サーバーの例と同じように使用できるようにします。この場合、スレッドプールを使用してタスクの数を制限します (それ以外の場合は、クライアントごとに 1 つのスレッドを使用するのと同じことになります)。

正しい方向を教えてください。または、実際にクライアントごとに 1 つのスレッドを持たずに並列ソケット書き込みを実装する方法についてのヒントを教えてください...?

よろしくお願いします、

セバスチャン

4

1 に答える 1

0

特定のソケットにデータを書き込む「WriteToSocket」関数があります。また、ミューテックスによって保護された、ソケットにバインドされたデータを保持するキューを用意します。関数で、送信するデータをソケットのキューに追加します。ソケットがすでにスレッドに割り当てられているかどうかを確認します(この目的のためにフラグを保持します)。もしそうなら、あなたは完了です。そうでない場合は、スレッドプールにジョブをスケジュールして、データをソケットから送信します。

多くの詳細に応じて、別の実装を好む場合があります。この実装では、各ソケットの送信ロジックには、キューとアンキューの2つのモードがあります。ソケットはキューから出され始めます。ソケットに送信する場合は、ソケットを保護するロックを取得します。キューモードの場合は、データをキューに追加すれば完了です。

キューに入れられていないモードの場合は、非ブロッキング送信でデータを送信してみてください。すべて送信すれば完了です。それ以外の場合は、未送信のデータをキューに保存し、ソケットをキューモードにします。

キューモードでソケットにデータを「定期的に」送信しようとするメカニズムを調整する必要があります。通常、これは「select」や「poll」などで行います。QTcpSocketsを使用すると、信号とスロットがあります。

于 2011-11-05T05:47:24.653 に答える