Pregunta

Mi programa utiliza Microsoft RPC para las comunicaciones entre procesos. Para prepararse para la recepción de llamadas RPC el programa se ejecuta la siguiente secuencia:

  1. RpcServerUseProtseqEp (), entonces

  2. RpcServerRegisterIf (), entonces

  3. RpcServerListen ()

El programa inicia su servidor de RPC con la secuencia anterior, trabaja desde hace algún tiempo, a continuación, termina más tarde y puede ser reiniciado por otro programa. El conjunto de valores de los parámetros para RpcServerUseProtseqEp () es el mismo cada vez que se ejecuta el programa.

Cuando la secuencia se ejecuta la primera vez después de reiniciar el sistema siempre tiene éxito, pero en posteriores ejecuciones RpcServerUseProtseqEp () devuelve RPC_S_DUPLICATE_ENDPOINT ( "El punto final es un duplicado.") Actualmente acabo de pasar por alto este código de error en particular y la trato como el éxito, entonces todas las otras primitivas por lo general funcionan bien.

¿Cuál es la forma correcta de utilizar RpcServerUseProtseqEp ()? ¿Debo hacer cualquier limpieza de revocar el punto final registrada o simplemente seguir ignorando el código de error RPC_S_DUPLICATE_ENDPOINT?

¿Fue útil?

Solución

que tenía el mismo problema, no puedo fijado totalmente, pero este código funciona para mí:

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

Por alguna razón usted tiene que esperar algún tiempo hasta su uso RpcServerUseProtseqEp de nuevo al reiniciar un servicio de Windows.

Otros consejos

No soy un experto en la RPC, pero creo que es posible que desee eliminar del registro a su punto final mediante RpcEpUnregister cuando el servidor termina. La documentación para esta función mencionan una base de datos de punto final que supongo que es persistente a través de instatiations de su servidor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top