Указание конечных точек
Конечная точка — это сетевой адрес серверного процесса для удаленных вызовов процедур. Фактическое имя конечной точки зависит от используемой последовательности протокола. Например, TCP, UDP и HTTP используют порты. Именованные каналы используют имя именованного канала. Клиентские или серверные приложения могут использовать хорошо известную конечную точку или динамическую конечную точку. В этом разделе представлены методы, используемые серверными программами для указания известных и динамических конечных точек. Сведения рассматриваются в следующих разделах:
Указание известных конечных точек
Когда сервер использует хорошо известную конечную точку, он может включать данные конечной точки в запись базы данных службы имен. В этом случае дескриптор привязки клиента содержит полный адрес сервера, который включает общеизвестную конечную точку, когда клиент импортирует дескриптор привязки из записи сервера.
Серверная программа также может указывать хорошо известные конечные точки одновременно с указанием последовательностей протоколов. Вызовите функцию RpcServerUseProtseqEp или RpcServerUseProtseqEpEx . Разница между ними заключается в том, что последняя функция имеет дополнительный параметр, который сервер может использовать для управления динамическим выделением портов.
Если серверная программа указывает сведения о конечной точке таким образом, она также должна вызвать функцию RpcEpRegister , чтобы зарегистрировать конечную точку в сопоставлении конечных точек. Несмотря на то, что конечная точка всегда одинакова, клиент может использовать сопоставление конечных точек для поиска сервера.
Как и последовательности протоколов, приложение может указать сведения о конечной точке в IDL-файле. В этом случае он должен регистрировать и последовательности протокола, и конечные точки одновременно, вызывая функцию RpcServerUseAllProtseqsIf или RpcServerUseAllProtseqsIfEx . В этом случае клиент имеет доступ к сведениям о конечной точке через спецификацию интерфейса в IDL-файле. Поэтому нет необходимости вызывать функцию RpcEpRegister .
Указание динамических конечных точек
Динамическая конечная точка — это конечная точка, которую главный компьютер сервера назначает при начале выполнения сервера. Большинство серверных приложений используют динамические конечные точки, чтобы избежать конфликтов с другими программами из-за ограниченного числа портов, доступных в системе компьютера узла сервера. Однако программы, использующие именованные каналы или последовательность протокола ncalrpc , имеют очень большое пространство имен конечных точек. Они получают меньше преимуществ от динамических конечных точек, чем программы, использующие другие транспорты.
Серверные программы регистрируют динамические конечные точки в базе данных сопоставления конечных точек. Если вы хотите, чтобы сервер использовал любую доступную конечную точку, вызовите RpcServerUseAllProtSeqs, RpcServerUseAllProtseqsEx, RpcServerUseProtseq или RpcServerUseProtseqEx. Это позволяет библиотеке времени выполнения RPC использовать все или одну допустимую последовательность протоколов с динамическими конечными точками. Затем сервер должен вызвать RpcServerInqBindings , чтобы получить набор допустимых дескрипторов привязки. Сервер передает набор дескрипторов привязки или вектора привязки в функцию RpcEpRegister , чтобы зарегистрировать все подходящие конечные точки в сопоставлении конечных точек. Для каждого вызова сервера в RpcEpRegister должен быть соответствующий вызов RpcBindingVectorFree , чтобы освободить память, которую использует вектор привязки.
Обратите внимание, что серверные программы могут использовать функцию RpcEpRegisterNoReplace вместо RpcEpRegister. Программы обычно используют RpcEpRegisterNoReplace , когда в системе узла сервера должно выполняться несколько копий серверной программы.
Функции RpcEpRegister и RpcEpRegisterNoReplace добавляют интерфейсы сервера и дескрипторы привязки в базу данных сопоставителя конечных точек. Когда клиент выполняет удаленный вызов процедуры с использованием частично привязанного дескриптора, библиотека времени выполнения клиента запрашивает у сопоставителя конечных точек компьютера сервера конечную точку совместимого экземпляра сервера. Клиентская библиотека предоставляет интерфейс UUID, последовательность протокола и, если он имеется, объект UUID в дескрипторе привязки клиента. Средство сопоставления конечных точек ищет запись базы данных, соответствующую сведениям клиента. UUID интерфейса клиента или сервера, основная версия интерфейса и последовательность протоколов должны точно совпадать. Кроме того, дополнительный номер версии интерфейса сервера должен быть больше или равен дополнительной версии клиента.
При успешном выполнении всех тестов средство сопоставления конечных точек возвращает допустимую конечную точку, а клиентская библиотека времени выполнения обновляет конечную точку в дескрипторове привязки.
Динамические конечные точки автоматически очищаются из базы данных сопоставителя конечных точек при остановке серверного процесса. Вы можете удалить конечную точку из базы данных сопоставителя конечных точек до завершения работы серверной программы с помощью функции RpcEpUnregister или разрешить автоматическую очистку для управления удалением конечной точки.