A robust server application should stop listening for clients, and clean up after itself before shutting down. The two core server functions that accomplish this are RpcMgmtStopServerListening and RpcServerUnregisterIf.
The server function RpcServerListen doesn't return to the calling program until an exception occurs, or until a call to RpcMgmtStopServerListening occurs. By default, only another server thread is allowed to halt the RPC server by using RpcMgmtStopServerListening. Clients who try to halt the server will receive the error RPC_S_ACCESS_DENIED. However, it is possible to configure RPC to allow some or all clients to stop the server. See the reference page for RpcMgmtStopServerListening for details.
You can also have the client application make a remote procedure call to a shutdown routine on the server. The shutdown routine calls RpcMgmtStopServerListening and RpcServerUnregisterIf. Our example application uses this approach by adding a new remote function, Shutdown, to the file hellop.c.
In the Shutdown function, the single null parameter to RpcMgmtStopServerListening indicates that the local application should stop listening for remote procedure calls. The two null parameters to RpcServerUnregisterIf are wildcards, indicating that all interfaces should be unregistered. The FALSE parameter indicates that the interface should be removed from the registry immediately, rather than waiting for pending calls to complete.
/* 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