Winsock カーネル関数とイベント コールバック関数の使用
特定のソケット操作について、Winsock Kernel (WSK) アプリケーションは、いずれかのソケットの WSK 関数を呼び出して操作を実行するか、操作に関連付けられたイベントの発生時に WSK サブシステムが呼び出すイベント コールバック関数をソケットに実装して有効にすることができます。 たとえば、接続指向ソケットでデータを受信する場合、WSK アプリケーションはソケットの WskReceive 関数を呼び出すか、ソケットに対して WskReceiveEvent イベント コールバック関数を実装して有効にすることができます。 WSK アプリケーションの要件によって、アプリケーションで使用する方法が決まります。 両方のメソッドを使用する方法の例は、WSK ドキュメント全体にわたって提供されています。
以下は、各メソッドについて重要なポイントをまとめたものです。
Winsock カーネル関数の使用
WSK アプリケーションはソケット操作を駆動します。つまり、WSK アプリケーションはソケット操作が発生するタイミングを制御します。 これにより、WSK アプリケーションで必要な同期が簡略化される場合があります。
WSK アプリケーションは、ソケット関数に IRP を提供します。 これらの IRP は、ソケット操作が完了するまで WSK サブシステムによってキューに入れられます。 WSK 関数での IRP の使用の詳細については、「Winsock カーネル関数での IRP の使用」を参照してください。
WSK アプリケーションは、WSK サブシステムによって各操作が完了するまで IRP を待機することで、ブロッキング ソケット操作を実行できます。
WSK アプリケーションでは、接続指向ソケットで高パフォーマンスのデータ転送を確保したり、受信データグラムがデータグラム ソケットで削除されたり、リッスンしているソケットで受信接続が削除されないようにするために、状況によっては複数のソケット操作をキューに入れた状態にする必要があります。
WSK アプリケーションは、データ転送操作用のデータ バッファーを提供します。 これにより、データのコピーが必要になる回数が減ります。 ただし、WSK アプリケーションが複数のデータ転送操作をキューに入れたままにする場合、アプリケーションはキューに入っている各データ転送操作のデータ バッファーを WSK サブシステムに提供する必要があります。 したがって、WSK アプリケーションに追加のメモリ リソースが必要になる場合があります。
イベントコールバック関数の使用
WSK サブシステムはソケット操作を駆動します。つまり、WSK サブシステムは、ソケットのイベント コールバック関数を呼び出すことによって、ソケットのイベントを WSK アプリケーションに通知します。 WSK アプリケーションでは、イベント コールバック関数の非同期性を処理するために、より複雑な同期が必要になる場合があります。
WSK アプリケーションは、ソケット操作に IRP を使用しません。
WSK アプリケーションでは、ソケット操作をキューに入れる必要はありません。 WSK サブシステムは、ソケットのイベントが発生するとすぐに WSK アプリケーションのイベント コールバック関数を呼び出します。 ソケットのイベント コールバック関数が呼び出される速度に WSK アプリケーションが追いつける場合、イベント コールバック関数を使用すると、最大限のパフォーマンスを実現しながらデータグラムまたは受信接続が破棄される可能性が最も低くなります。
WSK サブシステムは、データ転送操作用のデータ バッファーを提供します。 WSK アプリケーションは、WSK サブシステムがメモリ リソースを使い果たさないように直ちに、または妥当な時間内に、これらのデータ バッファーを WSK サブシステムに解放する必要があります。 したがって、WSK アプリケーションでは、WSK サブシステムが所有するデータ バッファーから独自のデータ バッファーにデータをコピーしなければならない場合があります。
注: 上記のリストは必ずしも網羅的ではありません。 特定の WSK アプリケーションに最適な方法を選択するにあたって、ほかにも考慮すべき点があります。