Windows ソケット : ソケット通知

この記事では、ソケット クラスの通知関数について説明します。 これらのメンバー関数は、ソケット オブジェクトに重要なイベントを通知するためにフレームワークが呼び出すコールバック関数です。 通知関数は次のとおりです。

  • OnReceive: Receive を呼び出すことによって取得するべきデータがバッファーに存在することを、このソケットに通知します。

  • OnSend: Send を呼び出すことによってデータを送信できることを、このソケットに通知します。

  • OnAccept: Accept を呼び出すことによって、保留中の接続要求を受け入れることができることを、この待機中のソケットに通知します。

  • OnConnect: 接続試行が完了したこと (成功の場合もエラーの場合もあります) を、接続しようとしているこのソケットに通知します。

  • OnClose: 接続先のソケットが閉じたことを、このソケットに通知します。

    Note

    その他の通知関数として OnOutOfBandData があります。 この通知は、受信側ソケットに対して、送信側ソケットに送信対象の "帯域外" データがあることを伝えます。 帯域外データは、接続されているストリーム ソケットの各ペアに関連付けられた、論理的に独立したチャネルです。 帯域外チャネルは、通常、"緊急" データを送信するために使用されます。 MFC では帯域外データをサポートしています。 CAsyncSocket クラスを操作する上級ユーザーは、帯域外チャネルを使用する必要が生じる場合がありますが、CSocket クラスのユーザーはこれを使用しないことをお勧めします。 そのようなデータを渡すためには 2 番目のソケットを作成する方が簡単です。 帯域外データの詳細については、Windows SDK に同梱されている Windows ソケット仕様を参照してください。

CAsyncSocket クラスから派生する場合は、アプリケーションにとって重要なネットワーク イベントの通知関数をオーバーライドする必要があります。 CSocket クラスからクラスを派生させる場合は、対象の通知関数をオーバーライドするかどうかを選択できます。 また、CSocket 自体を使用することもできます。その場合、通知関数は既定で何も実行しません。

これらの関数は、オーバーライド可能なコールバック関数です。 CAsyncSocket および CSocket はメッセージを通知に変換しますが、これらを使用する場合は、通知関数の応答方法を実装する必要があります。 通知関数は、読み取るべきデータが存在するなど、対象となるイベントがソケットに通知されたときに呼び出されます。

MFC は通知関数を呼び出して、通知された時点でソケットの動作をカスタマイズできるようにします。 たとえば、OnReceive 通知関数から Receive を呼び出すことができます。つまり、読み取るデータが存在することが通知された時点で、Receive を呼び出して読み取ることができます。 この方法は必須というわけではありませんが、有効なシナリオです。 別の方法として、通知関数を使用して、進行状況の追跡し、トレース メッセージを出力するといったこともできます。

これらの通知を利用するには、派生ソケット クラスで通知関数をオーバーライドし、実装を提供します。

データの受送信などの操作中は、CSocket オブジェクトが同期状態になります。 同期状態の間は、他のソケットに向けた通知はキューに登録され、現在のソケットは必要な通知を待機します (たとえば、呼び出し中 Receive に、ソケットは通知を読み取る必要があります)。ソケットが同期操作を完了し、もう一度非同期になると、他のソケットがキューに登録された通知の受信を開始できます。

Note

CSocket では、OnConnect 通知関数は呼び出されません。 接続については、Connect を呼び出すと、接続が完了したときに返されます (成功またはエラー)。 接続通知の処理方法は、MFC 実装の詳細情報です。

各通知関数の詳細については、MFC のリファレンスCAsyncSocket クラスの関数を参照してください。 ソース コードと MFC サンプルについては、MFC サンプルに関するページを参照してください。

詳細については、以下を参照してください:

関連項目

MFC における Windows ソケット