サーバー アプリケーションの停止
サーバー アプリケーションは、 RpcMgmtStopServerListening と RpcServerUnregisterIf を呼び出すか、ホスト プロセスを終了するだけで、クライアントのリッスンを停止できます。 どちらの方法でもかまいません。 サーバーが最初のアプローチに従う場合は、次の手順を実装する必要があります。
サーバー関数 RpcServerListen は、例外が発生するまで、または RpcMgmtStopServerListening の呼び出しが発生するまで、呼び出し元のプログラムに戻りません。 既定では、 RpcMgmtStopServerListening を使用して RPC サーバーを停止できるのは、別のサーバー スレッドのみです。 サーバーを停止しようとしたクライアントは、エラー RPC_S_ACCESS_DENIEDを受け取ります。 ただし、一部またはすべてのクライアントがサーバーを停止できるように RPC を構成できます。 詳細については、「 RpcMgmtStopServerListening 」を参照してください。
クライアント アプリケーションに、サーバー上のシャットダウン ルーチンへのリモート プロシージャ コールを実行させることもできます。 シャットダウン ルーチンは 、RpcMgmtStopServerListening と RpcServerUnregisterIf を呼び出します。 このチュートリアルのサンプル プログラム アプリケーションでは、Hellop.c ファイルに新しいリモート関数 Shutdown を追加することで、この方法を使用します。
Shutdown 関数では、RpcMgmtStopServerListening への単一の null パラメーターは、ローカル アプリケーションがリモート プロシージャ 呼び出しのリッスンを停止する必要があることを示します。 RpcServerUnregisterIf への 2 つの null パラメーターはワイルドカードであり、すべてのインターフェイスを登録解除する必要があることを示します。 FALSE パラメーターは、保留中の呼び出しが完了するのを待つのではなく、インターフェイスをレジストリからすぐに削除する必要があることを示します。
/* add this function to hellop.c */
void Shutdown(void)
{
RPC_STATUS status;
status = RpcMgmtStopServerListening(NULL);
if (status)
{
exit(status);
}
status = RpcServerUnregisterIf(NULL, NULL, FALSE);
if (status)
{
exit(status);
}
} //end Shutdown