启动RPC服务器时“端点是重复的”

时间:2009-04-14 07:59:58

标签: c++ windows rpc

我的程序使用Microsoft RPC进行进程间通信。要准备接收RPC调用,程序将按以下顺序运行:

  1. RpcServerUseProtseqEp(),然后

  2. RpcServerRegisterIf(),然后

  3. RpcServerListen()

  4. 程序按上述顺序启动其RPC服务器,工作一段时间,然后终止,稍后可能会被另一个程序重新启动。每次运行程序时,RpcServerUseProtseqEp()的参数值集都是相同的。

    当序列在重新启动后第一次运行时它总是成功,但在后续运行中,RpcServerUseProtseqEp()返回RPC_S_DUPLICATE_ENDPOINT(“端点是重复的。”)目前我只是忽略这个特定的错误代码并将其视为成功,然后所有其他原语通常都能正常工作。

    使用RpcServerUseProtseqEp()的正确方法是什么?我应该进行任何清理来撤销已注册的端点,还是只是忽略RPC_S_DUPLICATE_ENDPOINT错误代码?

2 个答案:

答案 0 :(得分:1)

我不是RPC的专家,但我认为您可能希望在服务器终止时使用 RpcEpUnregister 取消注册您的终端。这个函数的文档提到了一个端点数据库,我猜这个端点数据库会在服务器的实例中持续存在。

答案 1 :(得分:1)

我有同样的问题,我无法完全解决,但这段代码对我有用:

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);

出于某种原因,您必须等待一段时间,直到重新启动Windows服务时再次使用RpcServerUseProtseqEp。