RPCサーバー起動時の「エンドポイントが重複しています」
質問
私のプログラムではプロセス間通信に Microsoft RPC を使用しています。RPC 呼び出しの受信を準備するために、プログラムは次のシーケンスを実行します。
RpcServerUseProtseqEp()、その後
RpcServerRegisterIf()、その後
RpcServerListen()
プログラムは上記のシーケンスで RPC サーバーを起動し、しばらく動作した後終了し、後で別のプログラムによって再起動される可能性があります。RpcServerUseProtseqEp() のパラメーター値のセットは、プログラムが実行されるたびに同じになります。
再起動後に初めてシーケンスが実行されるときは常に成功しますが、それ以降の実行では RpcServerUseProtseqEp() が RPC_S_DUPLICATE_ENDPOINT (「エンドポイントが重複しています。」) を返します。現在、この特定のエラー コードを無視して成功として扱います。その後、すべての他のプリミティブは通常は正常に動作します。
RpcServerUseProtseqEp() の正しい使用方法は何ですか?登録されたエンドポイントを取り消すためにクリーンアップを実行する必要がありますか、それとも RPC_S_DUPLICATE_ENDPOINT エラー コードを無視し続ける必要がありますか?
解決
私は同じ問題を抱えていた、私は完全に固定することはできませんが、このコードは私のために動作します:
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までいくつかの時間を待たなければならないいくつかの理由ます。
他のヒント
私は、RPCの専門家ではないんだけど、私は、あなたのサーバが終了したときに、のRpcEpUnregisterの使用して、エンドポイントの登録を解除したいかもしれないと思います。この関数のドキュメントは、私はあなたのサーバーの実体化渡って持続されると思いエンドポイントデータベースに言及しています。