2009-04-14 30 views
2

我的程序使用Microsoft RPC进行进程间通信。用于接收RPC调用程序准备运行如下序列:启动RPC服务器时,“端点重复”

  1. RpcServerUseProtseqEp(),然后

  2. RpcServerRegisterIf(),然后

  3. RpcServerListen()

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

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

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

回答

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 。

1

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

+0

尝试调用RpcServerInqBindings(),然后调用RpcEpUnregister()。前者成功,后者返回“服务器端点未能执行操作”。 – sharptooth 2009-04-14 10:24:51