3

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

  1. RpcServerUseProtseqEp(),然后

  2. RpcServerRegisterIf(),然后

  3. RPCServerListen()

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

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

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

4

2 回答 2

1

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

于 2009-04-14T09:21:46.660 回答
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。

于 2010-10-26T14:25:50.797 回答