2009-04-14 5 views
2

Mein Programm verwendet Microsoft RPC für die Interprozesskommunikation. RPC ruft das Programm zur Vorbereitung für den Empfang läuft die folgende Sequenz:"Endpunkt ist ein Duplikat" beim Starten eines RPC-Servers

  1. RpcServerUseProtseqEp(), dann

  2. RpcServerRegisterIf(), dann

  3. RpcServerListen()

Das Programm startet seinen RPC-Server mit der obigen Sequenz, arbeitet für einige Zeit, wird dann beendet und kann später von einem anderen Programm neu gestartet werden. Die Menge der Parameterwerte für RpcServerUseProtseqEp() ist bei jedem Ausführen des Programms gleich.

Wenn die Sequenz das erste Mal nach dem Neustart ausgeführt wird, ist es immer erfolgreich, aber bei nachfolgenden Ausführungen gibt RpcServerUseProtseqEp() RPC_S_DUPLICATE_ENDPOINT zurück ("Der Endpunkt ist ein Duplikat.") Ich ignoriere gerade diesen bestimmten Fehlercode und behandle ihn als Erfolg , dann funktionieren normalerweise alle anderen Primitiven gut.

Was ist die korrekte Art der Verwendung von RpcServerUseProtseqEp()? Soll ich den registrierten Endpunkt bereinigen oder den Fehlercode RPC_S_DUPLICATE_ENDPOINT ignorieren?

Antwort

1

Ich hatte das gleiche Problem, ich nicht völlig fixiert, aber dieser Code funktioniert für mich:

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

Aus irgendeinem Grund Sie einige Zeit bis zur Verwendung RpcServerUseProtseqEp wieder warten müssen, wenn Sie einen Windows-Dienst neu starten .

1

Ich bin kein Experte für RPC, aber ich denke, Sie möchten möglicherweise Ihren Endpunkt mit RpcEpUnregister abmelden, wenn Ihr Server terminiert. In den Dokumenten für diese Funktion wird eine Endpoint-Datenbank erwähnt, die vermutlich in den verschiedenen Instanzen Ihres Servers bestehen bleibt.

+0

Versucht, RpcServerInqBindings() aufzurufen, dann RpcEpUnregister(). Ersteres ist erfolgreich, letzteres gibt "der Server-Endpunkt konnte die Operation nicht ausführen" zurück. – sharptooth

Verwandte Themen