Поделиться через


Остановка серверного приложения

Серверное приложение может прекратить прослушивание клиентов, вызвав RpcMgmtStopServerListening и RpcServerUnregisterIf или просто выйдя из хост-процесса. Оба метода являются приемлемыми. Если сервер следует первому подходу, он должен выполнить следующие действия:

Серверная функция RpcServerListen не возвращается в вызывающую программу, пока не возникнет исключение или пока не произойдет вызов RpcMgmtStopServerListening . По умолчанию только другому потоку сервера разрешено останавливать сервер RPC с помощью RpcMgmtStopServerListening. Клиенты, которые пытаются остановить сервер, получат сообщение об ошибке RPC_S_ACCESS_DENIED. Однако можно настроить RPC, чтобы разрешить некоторым или всем клиентам останавливать сервер. Дополнительные сведения см. в разделе RpcMgmtStopServerListening .

Вы также можете заставить клиентское приложение выполнить удаленный вызов процедуры завершения работы на сервере. Подпрограмма завершения работы вызывает RpcMgmtStopServerListening и RpcServerUnregisterIf. В этом примере программного приложения используется этот подход путем добавления новой удаленной функции Shutdown в файл Hellop.c.

В функции Shutdown один параметр null для RpcMgmtStopServerListening указывает, что локальное приложение должно прекратить прослушивание удаленных вызовов процедур. Два параметра null для RpcServerUnregisterIf являются подстановочными знаками, указывающими, что все интерфейсы должны быть отменены. Параметр 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