"Ya se escucha" cuando se invoca una llamada RPC
-
22-08-2019 - |
Pregunta
Yo uso Microsoft RPC para comunicaciones entre procesos.Tengo una interfaz con un conjunto de métodos que aceptan un byte de tubería "en" parámetro (IDL descripción):
[
uuid(ActualGuidHere),
version(1.0),
pointer_default(unique)
]
interface IMyInterface
{
//other irrelevant methods here
error_status_t rpcDoAction( [in] pipe byte params );
//more irrelevant methods here
}
cada de vez en cuando invoco tales métodos en un lado del cliente a través de un cliente stub generado por MIDL y delegadas a NdrClientCall2(), no alcanza para el lado del servidor, pero NdrClientCall2() devuelve RPC_S_ALREADY_LISTENING ("El servidor está a la escucha"), que es realmente confuso.
He añadido el registro en las funciones usadas para la inserción/extracción de las operaciones durante la transferencia - que no son llamados por las llamadas que no de esta manera.Esto implica que la transmisión es ni siquiera ha comenzado.
Yo nunca encuentro tal comportamiento a la hora de llamar a los métodos que no tienen tuberías como parámetros.
¿Cuál podría ser el motivo y la solución?
Solución
La documentación parece bastante mínima - no creo que hay una enorme comunidad de usuarios para directa el uso de la RPC Api - pero mi conjetura es que, en el fin de establecer el parámetro de la tubería, es necesario para que RPC internamente llamada RpcServerListen
.Sólo una llamada a la API es capaz de bloquear en un momento.
El hecho de que usted vea el problema sólo de vez en cuando sugiere que es tiempo, así que es posible que se están haciendo dos de esas llamadas en diferentes hilos, y a veces será simultánea?
O eso, o hay un tiempo relacionados con error en la RPC de la biblioteca de la aplicación y usted tendrá que trabajar alrededor de ella por volver a intentar la llamada (que puede ser una solución efectiva en cualquier caso).
Otros consejos
Creo que esto no debe ser tratado como un problema. Ver PRB: CoCreateInstance se produce un error en el servidor de RPC < br>
Ver también éste: cómo registrarse RPC múltiple Interfaces de servidor
[ACTUALIZACIÓN]
Tal vez hay un problema en la liberación de memoria. Ver ejemplos de implementación de TUBO y comprobar su código.
La implementación de los tubos de entrada en el cliente
La implementación de los tubos de salida en el cliente
La implementación de los tubos de entrada en el servidor de
La implementación de los tubos de salida en el servidor
Buena suerte.