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


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

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

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

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

В функции завершения работы единственный параметр 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