Удаленный вызов процедур (RPC) в C++: могут ли несколько клиентов прослушивать один сервер, если конечная точка жестко запрограммирована?

Я пишу простой сервер-клиент, используя MIDL и RPC, чтобы разрешить передачу файлов. Это работает, когда конечная точка жестко закодирована следующим образом:

серверная часть

status = RpcServerUseProtseqEp(  
    reinterpret_cast<unsigned char*>("ncacn_ip_tcp"), 
    RPC_C_PROTSEQ_MAX_REQS_DEFAULT,                   
    reinterpret_cast<unsigned char*>("8888"),         
    NULL);                                            

Сторона клиента

status = RpcStringBindingCompose(NULL,
    "ncacn_ip_tcp",
    (RPC_CSTR)"127.0.0.1", 
    "8888",
    NULL,
    NULL);

Мне интересно, могут ли несколько клиентов подключаться к одному серверу, когда конечная точка жестко запрограммирована? Как мы знаем, при программировании сокетов с использованием протокола TCP два приложения не могут одновременно подключаться к одному порту. Однако в справке MSDN говорится, что серверный процесс RPC использует для обработки запросов очередь вызовов в порядке поступления.

Если он не может получать несколько запросов от клиентов, есть ли способ установить пул конечных точек? Спасибо.


person tianhuaf    schedule 29.08.2017    source источник
comment
Обычно серверы прослушивают запросы клиентов. Хотите проверить эту фразу?   -  person harper    schedule 29.08.2017


Ответы (1)


Вы путаете терминологию здесь.

сервер прослушивает TCP-порт. Это означает, что он привязывается к порту и запускает на нем цикл приема. Каждый раз, когда новый клиент подключается к этому порту, функция accept устанавливает соединение TCP с этим клиентом и возвращается к прослушиванию порта.

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

Типичный сервер RPC будет выглядеть примерно так

status = RpcServerUseProtseqEp(pszProtocolSequence,
                               RPC_C_LISTEN_MAX_CALLS_DEFAULT,
                               pszEndpoint,
                               pszSecurity); 

if (status) exit(status);

status = RpcServerRegisterIf(my_rpc_interface_spec,  
                             NULL,   
                             NULL); 

if (status) exit(status);

status = RpcServerListen(cMinCalls,
                         RPC_C_LISTEN_MAX_CALLS_DEFAULT,
                         0);

if (status) exit(status);

Вызов RpcServerListen блокируется навсегда, запускает cMinCalls рабочих потоков и выполняет цикл accept, принимая соединения и обрабатывая запросы в cMinCalls параллельных потоках.

person rustyx    schedule 29.08.2017