gpt4 book ai didi

c++ - 部分读取/写入 Cap'n Proto 消息

转载 作者:行者123 更新时间:2023-11-28 04:58:19 33 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于c++ - 部分读取/写入 Cap'n Proto 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46690956/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com