1

我使用 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(“服务器已经在监听") 这真的很令人困惑。

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

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

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

4

2 回答 2

1

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

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

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

于 2009-03-26T07:48:45.027 回答
0

我认为这不应该被视为一个问题。请参阅PRB:RPC 服务器中的 CoCreateInstance 失败

也可以查看这个:如何注册多个 RPC 服务器接口

[更新] 可能内存释放有问题。查看PIPE的实现示例并检查您的代码。
在客户端实现输入管道 在客户端
实现输出管道 在
服务器上实现输入管道 在服务器上
实现输出管道

祝你好运。

于 2009-03-26T14:38:39.473 回答