«конечная точка является дубликатом» при запуске сервера RPC - PullRequest
2 голосов
/ 14 апреля 2009

Моя программа использует Microsoft RPC для межпроцессного взаимодействия. Для подготовки к приему вызовов RPC программа запускает следующую последовательность:

  1. RpcServerUseProtseqEp (), затем

  2. RpcServerRegisterIf (), затем

  3. RpcServerListen ()

Программа запускает свой RPC-сервер с описанной выше последовательностью, работает некоторое время, затем завершается и может быть позже перезапущена другой программой. Набор значений параметров для RpcServerUseProtseqEp () одинаков при каждом запуске программы.

Когда последовательность запускается первый раз после перезагрузки, она всегда завершается успешно, но при последующих запусках RpcServerUseProtseqEp () возвращает RPC_S_DUPLICATE_ENDPOINT («Конечная точка является дубликатом».) В настоящее время я просто игнорирую этот конкретный код ошибки и рассматриваю его как успешный тогда все остальные примитивы обычно работают нормально.

Как правильно использовать RpcServerUseProtseqEp ()? Должен ли я выполнить какую-либо очистку, чтобы отозвать зарегистрированную конечную точку или просто игнорировать код ошибки RPC_S_DUPLICATE_ENDPOINT?

Ответы [ 2 ]

1 голос
/ 26 октября 2010

У меня была такая же проблема, я не могу исправить полностью, но этот код работает для меня:

UCHAR* pszProtocolSequence = (UCHAR*)"ncacn_ip_tcp"; // Use RPC over TCP/IP
UCHAR* pszSecurity = NULL;
UCHAR* pszEndpoint = (UCHAR*)"9300";
UINT cMinCalls = 1;
UINT cMaxCalls = m_dwConcurrentChannels;
UINT fDontWait = FALSE;

int RPC_tries, MAX_RPC_Tries;
RPC_tries=0;
MAX_RPC_Tries=60;
do
{
    status = ::RpcServerUseProtseqEp(
    pszProtocolSequence, cMaxCalls, pszEndpoint, pszSecurity);
    Sleep(1000);
    RPC_tries+=1;
}while(status!=RPC_S_OK && RPC_tries<MAX_RPC_Tries);

По какой-то причине вам придется подождать некоторое время, пока вы снова не используете RpcServerUseProtseqEp при перезапуске службы Windows.

1 голос
/ 14 апреля 2009

Я не эксперт по RPC, но я думаю, что вы можете отменить регистрацию вашей конечной точки, используя RpcEpUnregister , когда ваш сервер завершает работу. В документах по этой функции упоминается база данных конечных точек, которая, как я полагаю, сохраняется в инстанциях вашего сервера.

...