我正在尝试在现有项目中使用Cap'n Proto,该项目包括通过UDS进行客户端和服务器通信。我没有资源(我怀疑它会被接受)重做所有客户端 - 服务器RPC,但我想从Cap'n Proto序列化机制中受益。不幸的是,在我看来这是不可能的。
最大的问题是服务器端,它是单线程的(如果没有任何严重的多线程参数,它将保持不变)并使用它自己的基于轮询的循环。所有事件都被部分读取,服务器无法阻止等待任何事件被完全读取 - 这就是我被困住的地方。我们有自己的协议和类来包装消息,它可以消耗文件描述符中的字节并在事件被完全读取时通知,因此服务器可以处理它。我想我已经分析了大多数Cap'n Proto接口(序列化,异步序列化),似乎它不能以相同的方式使用而不做任何修改。
我真的希望我错过了什么。我有吗?
答案 0 :(得分:1)
有两种方法可以解决这个问题:
capnp/serialize-async.h
中的接口的KJ样式异步代码。capnp::expectedSizeInWordsFromPrefix()
(来自{{1确定它是否已收到整个消息。如果该函数返回的数字大于您已有的数字,那么您将没有完整的消息并且必须继续等待。收到完整邮件后,您可以使用capnp/serialize.h
对其进行解析。