0

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

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

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

4

1 回答 1

1

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

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