2011-08-05 11 views
0

C++、Windowsのスレッド同期に関する設計上の問題に直面しています。すべてのアクティブなスレッドにシグナルを送る(Windows)

スレッドをリッスンするサーバーアプリケーションを作成していますが、これはサーバーが稼動している間は常にアクティブな状態を保つ必要があります。 リスニングスレッドがに接続すると、要求が送信され、CONTROLソケットが開き、新しいコントロールスレッドが開始されます。 このスレッドは、サーバとクライアントの間で制御データを送信し、サーバとすべてのバックグラウンドソフトウェアを特定のクライアントデータに初期化し、データ処理を開始するために使用されます。

制御スレッドは、新しいソケットDATAソケットを開き、サーバーからクライアントにデータを渡すために使用されます。また、この新しいDATAソケットを送信する2つの新しいスレッドと、クライアントが接続を終了したい場合はCONTROLソケットを受信して​​いるもう1つの新しいスレッドを開始します。

クライアントがどうするかである、ここで、接続を閉じるには、サーバーメッセージを送信関数の呼び出しせずにアプリケーションを終了させることによって、不正に接続を終了する場合:

  • 実行中のスレッドのいずれかがこのイベントを検出することができます。彼らは、DATA/CONTROLソケットで送受信中に何らかのエラー(WSAECONNRESET)を取得し、実行を停止すべき他のすべてのスレッド(サーバーのリスニングスレッドを除く)を通知する必要があります。

このタイプの動作を達成する最も自然な方法はどれですか?

あなたはマルチスレッドのWinsockサーバーを書いている場合は、あなたに探している必要があり

+1

多くのスレッドを使用しているようです。 – Steve

+0

これがどのようにエレガントに変更されるかに関する建設的なコメントは大歓迎です。 これは私の最初のマルチスレッドアプリケーションであり、この種の問題を処理する通常の方法に慣れていません。元のアイデアの改善についてアイデアを投稿してください。 サーバーはデータと制御ソケットを同時に送信できる必要があります。これを2つのスレッドで分けなければ、これをどのように達成できますか? また、recvとsend関数はブロック動作を排除しています。そのため、これを2つのスレッド(1つは受信、もう1つはソケットで送信)に分割することにしました。 – construKction

+0

@construKction:WSAWaitForMultipleEventsを参照してください。 'recv'はあなたがすでに"データ利用可能 "イベントを待っていればブロックしていません。 – MSalters

答えて

0

(私は、スレッドのためのWinsock(winsock2.h)ネットワーキングのために、標準のWindows API(WINDOWS.H)を使用しています) IO完了ポート。 IO完了ポートを使用することは、Windowsプラットフォーム上でネットワークサービスを作成するための最もスケーラブルな方法です。

IO完了ポートベースのwinsockサーバーは非同期通信を使用するため、ソケットでブロックする代わりに、何か面白いことが起こったときにスレッドプールが完了パケットを受信します。

いずれにしても、WSARecvが使用されます。 WSARecvがゼロ以外を返す場合は、WSAGetLastError()を呼び出します。あなたはWSA_IO_PENDINGを持っていない場合は、エラーに切り替えるとwinsock error codeあなたが興味を探してください。

Winsockエラーコード(例えばWSAECONNABORTED)他の人があるがWSA_OPERATION_ABORTED、ソケットが閉じられたことを示します。

件名(例:C/C++経由のWindowsなど)には良いテキストが表示されます。

0

WSAEventSelect()関数を使用すると、イベントオブジェクトをソケットに関連付けてイベント用のイベントオブジェクトを1つ作成し、WaitForMultipleObjects()関数でこれらのイベントオブジェクトを使用してスレッドがソケットイベントとカスタムイベントを待つことができます。

関連する問題