C++、Windowsのスレッド同期に関する設計上の問題に直面しています。すべてのアクティブなスレッドにシグナルを送る(Windows)
スレッドをリッスンするサーバーアプリケーションを作成していますが、これはサーバーが稼動している間は常にアクティブな状態を保つ必要があります。 リスニングスレッドがに接続すると、要求が送信され、CONTROLソケットが開き、新しいコントロールスレッドが開始されます。 このスレッドは、サーバとクライアントの間で制御データを送信し、サーバとすべてのバックグラウンドソフトウェアを特定のクライアントデータに初期化し、データ処理を開始するために使用されます。
制御スレッドは、新しいソケットDATAソケットを開き、サーバーからクライアントにデータを渡すために使用されます。また、この新しいDATAソケットを送信する2つの新しいスレッドと、クライアントが接続を終了したい場合はCONTROLソケットを受信しているもう1つの新しいスレッドを開始します。
クライアントがどうするかである、ここで、接続を閉じるには、サーバーメッセージを送信関数の呼び出しせずにアプリケーションを終了させることによって、不正に接続を終了する場合:
- 実行中のスレッドのいずれかがこのイベントを検出することができます。彼らは、DATA/CONTROLソケットで送受信中に何らかのエラー(WSAECONNRESET)を取得し、実行を停止すべき他のすべてのスレッド(サーバーのリスニングスレッドを除く)を通知する必要があります。
このタイプの動作を達成する最も自然な方法はどれですか?
あなたはマルチスレッドのWinsockサーバーを書いている場合は、あなたに探している必要があり
多くのスレッドを使用しているようです。 – Steve
これがどのようにエレガントに変更されるかに関する建設的なコメントは大歓迎です。 これは私の最初のマルチスレッドアプリケーションであり、この種の問題を処理する通常の方法に慣れていません。元のアイデアの改善についてアイデアを投稿してください。 サーバーはデータと制御ソケットを同時に送信できる必要があります。これを2つのスレッドで分けなければ、これをどのように達成できますか? また、recvとsend関数はブロック動作を排除しています。そのため、これを2つのスレッド(1つは受信、もう1つはソケットで送信)に分割することにしました。 – construKction
@construKction:WSAWaitForMultipleEventsを参照してください。 'recv'はあなたがすでに"データ利用可能 "イベントを待っていればブロックしていません。 – MSalters