部分地读/写Cap'n Proto消息

时间:2017-10-11 14:32:31

标签: c++ asynchronous capnproto

我正在尝试在现有项目中使用Cap'n Proto,该项目包括通过UDS进行客户端和服务器通信。我没有资源(我怀疑它会被接受)重做所有客户端 - 服务器RPC,但我想从Cap'n Proto序列化机制中受益。不幸的是,在我看来这是不可能的。

最大的问题是服务器端,它是单线程的(如果没有任何严重的多线程参数,它将保持不变)并使用它自己的基于轮询的循环。所有事件都被部分读取,服务器无法阻止等待任何事件被完全读取 - 这就是我被困住的地方。我们有自己的协议和类来包装消息,它可以消耗文件描述符中的字节并在事件被完全读取时通知,因此服务器可以处理它。我想我已经分析了大多数Cap'n Proto接口(序列化,异步序列化),似乎它不能以相同的方式使用而不做任何修改。

我真的希望我错过了什么。我有吗?

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决这个问题:

  • 困难的方法:您可以尝试与KJ异步I / O框架集成(由Cap' n Proto使用)。 KJ事件循环实际上可以与其他事件循环集成并在它们之上运行 - 但它很棘手。例如,node-capnp包含用于将KJ事件循环与libuv集成的代码,如this source file的第一部分所示。获得必要的粘合剂后,您可以编写使用capnp/serialize-async.h中的接口的KJ样式异步代码。
  • 简单方法:您可以使用事件基础结构编写简单代码,而不是尝试集成KJ,直接从文件描述符中读取数据,然后使用capnp::expectedSizeInWordsFromPrefix()(来自{{1确定它是否已收到整个消息。如果该函数返回的数字大于您已有的数字,那么您将没有完整的消息并且必须继续等待。收到完整邮件后,您可以使用capnp/serialize.h对其进行解析。