【问题标题】:"endpoint is a duplicate" when starting an RPC server启动 RPC 服务器时出现“端点重复”
【发布时间】:2010-10-19 07:16:28
【问题描述】:

我的程序使用 Microsoft RPC 进行进程间通信。为了准备接收 RPC 调用,程序运行以下序列:

  1. RpcServerUseProtseqEp(),然后

  2. RpcServerRegisterIf(),然后

  3. RpcServerListen()

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

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

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

【问题讨论】:

    标签: c++ windows rpc


    【解决方案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。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 尝试调用 RpcServerInqBindings(),然后调用 RpcEpUnregister()。前者成功,后者返回“服务器端点执行操作失败”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 2013-03-10
      • 2017-11-03
      • 2021-10-24
      相关资源
      最近更新 更多