调用RPC调用时“已经在侦听”

时间:2009-03-26 05:28:34

标签: c++ visual-studio visual-c++ interop rpc

我使用Microsoft RPC进行进程间通信。我有一个接口,其中包含一组接受字节管道作为“in”参数的方法(IDL描述):

[
    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
}

每当我在客户端通过MIDL生成的客户端存根调用此类方法并委托给NdrClientCall2()时,它不会到达服务器端,但是NdrClientCall2()返回RPC_S_ALREADY_LISTENING(“服务器”已经在听了“),这真的令人困惑。

我在传输期间添加了用于推/拉操作的函数的记录 - 它们不会被调用任何以这种方式失败的调用。这意味着甚至没有开始传输。

在调用没有管道作为参数的方法时,我从未遇到过这种行为。

可能是什么原因和解决方法?

2 个答案:

答案 0 :(得分:1)

文档似乎很少 - 我认为直接使用RPC API没有庞大的用户社区 - 但我的猜测是,为了设置管道参数,它RPC在内部调用RpcServerListen是必要的。只有一次调用该API才能一次阻止。

您偶尔会看到问题的事实表明它与时间有关,您是否有可能在不同的线程上进行两次此类调用,有时它们会同时发生?

要么在RPC库的实现中存在与时序相关的错误,您必须通过重试调用来解决它(在任何情况下这可能是一种有效的解决方法)。

答案 1 :(得分:0)

我认为这不应该被视为一个问题。见PRB: CoCreateInstance Fails in RPC Server

也可以查看此内容:How To Register Multiple RPC Server Interfaces

[UPDATE] 也许在内存释放方面存在问题。查看PIPE的实施示例并检查您的代码 Implementing Input Pipes on the Client
Implementing Output Pipes on the Client
Implementing Input Pipes on the Server
Implementing Output Pipes on the Server

祝你好运。