RPCサーバー起動時の「エンドポイントが重複しています」

StackOverflow https://stackoverflow.com/questions/746702

  •  09-09-2019
  •  | 
  •  

質問

私のプログラムではプロセス間通信に Microsoft RPC を使用しています。RPC 呼び出しの受信を準備するために、プログラムは次のシーケンスを実行します。

  1. RpcServerUseProtseqEp()、その後

  2. RpcServerRegisterIf()、その後

  3. 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の使用して、エンドポイントの登録を解除したいかもしれないと思います。この関数のドキュメントは、私はあなたのサーバーの実体化渡って持続されると思いエンドポイントデータベースに言及しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top