NDKPI リスナー、コネクタ、およびエンドポイント
NDK コンシューマーは、NdkConnect (NDK_FN_CONNECT) または NdkConnectWithSharedEndpoint (NDK_FN_CONNECT_WITH_SHARED_ENDPOINT) 関数を呼び出して NDK コネクタを接続します。
接続状態にある各コネクタには、確立された NDK 接続のローカルエンドを表す下位のエンドポイントもあります。
- NDK リスナー経由で受信接続を受け入れることによって確立されたコネクタは、リスナーの暗黙のエンドポイントをローカルの暗黙のエンドポイントとして自動的に継承します。
- NdkConnect 関数を介して接続されたコネクタには、専用の暗黙のローカルエンドポイントがあります。
- NdkConnectWithSharedEndpoint 関数を介して接続されたコネクタには、NdkConnectWithSharedEndpoint 関数を介して接続されている他のコネクタと共有できる明示的なローカル エンドポイントがあります。
NDK プロバイダーは、暗黙のまたは明示的なエンドポイントごとに何らかの参照カウントを保持し、参照カウントが 0 に達したときにエンドポイントを解放する必要があります (つまり、アドレス/ポートを再び使用できるようにマークします)。
(共有されていない) エンドポイントの参照カウント
コンシューマーが NdkListen (NDK_FN_LISTEN) 関数を呼び出すと、プロバイダーは暗黙のエンドポイントを作成します。 この暗黙のエンドポイントの場合、プロバイダーは以下のように参照カウントを維持する必要があります。
リスナー自体の参照をエンドポイントの参照カウントに追加します。
そのリスナーで受け入れられる各コネクタの参照を追加します。
リスナーで以前に受け入れられていたコネクタが閉じられると、参照を削除します。
リスナー自体が閉じているときに参照を削除します。 注: すべてのコネクタが閉じられるまで、リスナーを閉じることはできません。
参照カウントが 0 に戻ったら、エンドポイントを解放します。 (これは、リスナーとリスナーで受け入れられたすべてのコネクタが閉じられている場合にのみ発生します)。
リスナーを閉じるだけでは、以前に受け入れられたコネクタがまだ閉じていない限り、エンドポイントは解放されません。 つまり、同じローカル アドレスとポートに対する新しい NdkListen、NdkConnect、および NdkConnectWithSharedEndpoint 要求は、そのような接続がすべて閉じられるまで失敗することを意味します。 リスナーに対するクローズ要求も、そのような接続がすべてクローズされるまで保留されたままになることに注意してください ( NDKPI オブジェクト寿命要件 で概要が説明されている先行/後続ルールのため)。 プロバイダーは、クローズ要求が発行されるとすぐに、リスナーへの着信接続をさらに拒否する必要があります (クローズ要求が保留中の間は、新しい接続は受け入れられなくなります)。
コネクタの参照カウント
コンシューマーが NdkConnect を呼び出すと、プロバイダーによって暗黙のエンドポイントが作成されます。 この暗黙のエンドポイントの場合、プロバイダーは次のことを行う必要があります。
- コネクタによる参照を追加します。 コネクタは 1 つしかないので、参照も 1 つしかありません。
- コネクタが閉じられると、コネクタのエンドポイントへの参照を削除します。
- 参照がなくなったら、エンドポイントを解放します。
共有エンドポイントの参照カウント
コンシューマーが NdkConnectWithSharedEndpoint を呼び出すと、プロバイダーは明示的な共有エンドポイントを作成します。 この明示的な共有エンドポイントの場合、プロバイダーは次の操作を行う必要があります。
- 共有エンドポイント自体の参照を、共有エンドポイントの参照カウントに追加します。
- その共有エンドポイントに接続されている各コネクタの参照を追加します。
- 共有エンドポイント経由で以前に接続されていたコネクタが閉じられると、参照を削除します。
- エンドポイントを解放すると、参照カウントはゼロに戻ります。 (これは、共有エンドポイントと、共有エンドポイント経由で接続されているすべてのコネクタが閉じられている場合です)。
- 共有エンドポイントを閉じるだけでは、以前に接続されたコネクタがまだ閉じられていない限り、エンドポイントは解放されません。 つまり、同じローカル アドレスとポートに対する新しい NdkListen、NdkConnect、および NdkConnectWithSharedEndpoint 要求は、そのような接続がすべて閉じられるまで失敗することを意味します。 共有エンドポイントに対するクローズ要求も、そのような接続がすべてクローズされるまで保留されたままになることに注意してください ( NDKPI オブジェクト寿命要件 で概要が説明されている先行/後続ルールのため)。