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


Предоставление доступа к серверу в сети

Прежде чем серверное приложение может принимать удаленные вызовы процедур, оно должно быть доступно в сети. Для этого сервер указывает среде выполнения RPC, что он готов принимать вызовы для одной или нескольких последовательностей протоколов. Выбор последовательностей протоколов, поддерживаемых серверным приложением, является важным решением; разные последовательности протоколов имеют очень разные возможности. Серверы, которые ожидают, что вызовы будут получены локально, должны использовать ncalrpc. Серверы, принимаюющие удаленные вызовы, должны использовать ncacn_ip_tcp. Серверы не должны проверять, что последовательность протоколов, в которой они получают вызовы, является последовательностью протоколов, в которой они ожидают получать вызовы. Дополнительные сведения см. в статье "Будьте осторожны с другими конечными точками RPC" в том же процессе.

В следующем примере кода используется ncacn_ip_tcp.

Большинство серверных программ используют все последовательности протоколов, доступные в сети. Для этого они вызывают функцию RpcServerUseProtseq , как показано в следующем фрагменте кода:

RPC_STATUS status;
status = RpcServerUseProtseq(
    L"ncacn_ip_tcp",
    RPC_C_PROTSEQ_MAX_REQS_DEFAULT,    // Protseq-dependent parameter
    NULL);                             // Always specify NULL here.

Первым параметром функции RpcServerUseProtseq является последовательность протоколов. Второй параметр зависит от последовательности протоколов. Как показано в примере кода, большинство серверных программ задают этот параметр для RPC_C_PROTSEQ_MAX_REQS_DEFAULT. Это значение задает библиотеку RPC для использования значения по умолчанию. Третий параметр — дескриптор безопасности и не должен использоваться в приложениях. Дополнительные сведения см. в разделе "Безопасность( RPC)".

Вы также можете вызывать функции RpcServerUseAllProtseqs, RpcServerUseProtseqEx, RpcServerUseProtseqEp или RpcServerUseProtseqEp.

После выбора по крайней мере одной последовательности протоколов серверы, использующие динамические конечные точки, должны создавать сведения о привязке для каждой используемой последовательности протоколов. Сервер хранит сведения о привязке в векторе привязки, который затем может экспортироваться в службу сопоставления конечных точек.

Используйте функцию RpcServerInqBindings для получения вектора привязки для серверного приложения, как показано в следующем примере:

RPC_STATUS status;
RPC_BINDING_VECTOR *rpcBindingVector;
 
status = RpcServerInqBindings(&rpcBindingVector);

Единственным параметром, переданным функции RpcServerInqBindings, является указатель на указатель на структуру RPC_BINDING_VECTOR. Библиотека времени выполнения RPC динамически выделяет массив векторов привязки и сохраняет адрес массива в этой переменной параметра (в данном случае rpcBindingVector). После завершения работы серверного приложения с помощью этого вектора привязки (например, после того, как он передал его соответствующим функциям), серверное приложение отвечает за освобождение этого вектора привязки с помощью функции RpcBindingVectorFree.