问题标签 [capnproto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
112 浏览

python - 如何在 Python 中读取没有 Premature 的 EOF 的船长原型消息(.bin 文件)?

我正在尝试阅读 captian proto .bin 消息(以打包形式编写):

但它会产生以下错误:

为什么会出现这个错误?我假设我没有正确阅读打包的消息(或类似的东西)。如何在 Captain proto for python 中正确打开这个文件的内容?

我阅读了以下链接,但它们没有帮助:

  1. 部分读取/写入 Cap'n Proto 消息
  2. 如何设置 Cap'n Proto RPC 消息遍历限制?
  3. https://github.com/capnproto/capnproto/issues/545
  4. https://jparyani.github.io/pycapnp/capnp.html#capnp._StructModule.read_packed

但他们并没有太大帮助。似乎很难在网上找到任何带有确切错误消息的东西:expected n >= minBytes; Premature EOF除了链接 4 似乎不太有用(并且没有提到 python 一词)。

顺便说一句,所有这三个都给出错误:


交叉发布:https ://github.com/capnproto/pycapnp/issues/257

0 投票
0 回答
114 浏览

linux - Yocto dunfell capnproto receipe,得到编译器错误

我正在我的 yocto dunfell 上构建 capnproto。capnproto_0.7.0.bb:http://layers.openembedded.org/layerindex/recipe/122812/ _

我还创建了 capnproto_0.7.0.bbappend 文件。

但是当我编译这个时,我遇到了错误

如果我EXTRA_OEMAKE "-DBUILD_SHARED_LIBS=TRUE"从我的 bbappend 文件中删除,那么我不会发现任何错误。

谢谢

0 投票
2 回答
328 浏览

c++ - 如何访问 Cap'n'Proto 的序列化数据?

我正在与 Cap'n'Proto 合作,我的理解是没有必要进行序列化,因为它已经完成了。所以我的问题是,我将如何访问序列化数据并获取它的大小,以便我可以将它作为字节数组传递给另一个库。

我看过这个writePackedMessageToFd(fd, message);电话,但不太明白传递了什么,也找不到任何 API 文档。我也没有尝试写入文件描述符,因为我需要以const void*.

在 Capnproto 的 message.h 文件中查看此函数,它位于 MallocMessageBuilder 的基类中,表示它获取构成消息的原始数据。

但即便如此,我也不知道如何将它作为const void*.

想法?

0 投票
1 回答
48 浏览

c - 如何在c中处理capn_data?

我使用c-capnproto序列化我的传感器数据。现在我需要向它添加一个 HMAC。它必须是一个capn_datablob,但这在示例代码中没有处理。

当我尝试添加数据时,它不起作用。这是我的capnp文件:

编译后,我使用它:

我编写了一个辅助函数,类似于chars_to_text示例中提供的函数

但我想我错过了一些部分。结果数据

至少在经过验证的数据中不再包含温度 ( 0x25)。HMAC也不存在,长度太短了。

您能否提示我如何处理capn_datablob,如何填充它以及如何将其打包到根目录中。

0 投票
0 回答
31 浏览

cmake - CMake 导出生成的源

我正在尝试在我的项目中使用自动生成的源,这样做非常简单。

这工作正常。可以按预期安装目标,我可以使用 find_package 找到我的库并链接到它。但是当生成的源中的 CapnProto 版本与安装的源不一致时,问题开始出现。在这种情况下,它们必须再次生成。我的想法是创建自定义目标来包装生成命令并将其导出,以便在导入时生成源。但我无法做到这一点。

有没有一种通用的方法可以做到这一点?我可以在依赖项目中重新编译这部分。

0 投票
0 回答
18 浏览

angular - capnp-ts TypeError: capnp_ts_src_serialization_message__WEBPACK_IMPORTED_MODULE_1__.Message 不是构造函数

我在我的 Visual Studio 2022 angular12 项目中安装了 capnp-ts:

https://github.com/jdiaz5513/capnp-ts

当我只想在其文档中使用“new capnp.Message()”方法时,它会在浏览器上引发此错误:

TypeError: capnp_ts_src_serialization_message__WEBPACK_IMPORTED_MODULE_1__.Message is not a constructor

代码就像 github 自述文件:

正如您在 Message.ts 文件中看到的,它有一个普通的构造函数:

https://github.com/jdiaz5513/capnp-ts/blob/master/packages/capnp-ts/src/serialization/message.ts

在 Visual Studio 中编写或编译时没有问题。它也显示了构造函数的参数。

我看到了很多关于“TypeError: ... is not a constructor”错误(比如更改导入行、更改源等)的解决方案的页面,但没有一个对此有帮助!

项目中的其他类和 capnproto 对象没有这个问题,我在“新”构造中正常使用它们。

那么 Message.ts 文件有什么问题?!


更新:

我现在检查了另一种更改导入线的方法。我用它来导入消息:

并使用“new Message()”而不是“new capnp.Message()”

但这解决了 Message 类本身的问题,并且项目中有很多这样的类,需要类似的更改!

所以它现在在 message.js 文件中引发了一个新错误:

TypeError: arena_1.SingleSegmentArena 不是构造函数

如果我解决了它,就会有另一个:D

所以我知道问题出在生成的js文件中,可以通过更改整个capnp-ts模块来解决问题,但是为什么会出现所有这些不兼容呢?!以及如何在不更改模块源文件的情况下修复它?!

我通过 npm 重新安装了模块,但没有任何改变。

0 投票
1 回答
15 浏览

capnproto - 在 Cap'n Proto 中定义类型别名

我不明白如何在 Cap'n Proto 中导出类型别名。

我能想到的最简单的例子是点云。假设我们有一个模式,例如

然后我还想将这些点的列表导出为固定类型:

在我看来(基于生成的代码)该PointCloud类型没有作为模式的一部分导出。似乎这PointCloud只能在模式文件中使用。

如何导出此别名以便在外部使用?

0 投票
0 回答
60 浏览

c++ - 是否有一种跨平台的方法可以在 C++ 中创建基于进程的套接字服务器?

这看起来看似简单,但伴随着许多令人讨厌的细节和兼容性问题。我有一些在 Linux 上运行的代码,并且在 Windows 上运行,但它有各种问题,这似乎是一个常见而简单的问题。我知道异步现在风靡一时,但我有充分的理由希望每个连接都有一个进程。

我正在编写一个托管模拟过程的服务器。因此,每个连接都是长时间运行且 CPU 密集型的。但更重要的是,这些模拟器(Ngspice、Xyce)具有全局状态,有时会出现段错误或达到不可恢复的错误。因此,每个连接都必须有自己的进程,这样它们就可以并行运行/崩溃,而不会弄乱彼此的状态。

另一个半重要的细节是该协议基于 Capnp RPC,它有一个很好的跨平台异步 API,但不是阻塞的。所以我要做的是拥有自己的阻塞接受循环,它分叉一个新进程,然后在新进程中启动 Capnp 事件循环。

所以我从一个简单的接受循环开始,添加了大量的 ifdef 来支持 windows,然后添加了 fork 使其成为多进程,然后添加了一个 SIGCHLD 处理程序来避免僵尸进程。但是 Windows 没有分叉,如果许多客户端同时断开连接,我仍然会遇到僵尸。

我当前的代码在这里:https ://github.com/NyanCAD/SimServer/blob/1ba47205904fe57196498653ece828c572579717/main.cpp

我可以使用更多 ifdefs 和 hack 来使 Windows 工作并避免僵尸,或者使用某种库来提供现成的多进程套接字服务器或编写这样的东西的功能。重要的部分是它可以接受新进程中的套接字并将原始 FD 传递给 Capnp 事件循环。

0 投票
1 回答
112 浏览

python - pycapnp:在没有自定义 capnp 文件的情况下读写列表

我已经通读了pycapnp 快速入门和文档,但我没有看到关于如何读取和写入基本列表对象(如浮点列表)的提及。

特别是,我知道如果我在 capnp 文件中编写自定义类型,那么我可以使用类似的东西读取该类型的对象

我想知道的是读取这样的浮点数列表的语法。我想它看起来像

但我根本找不到正确的语法。此外,由于 Capn Proto 不会从 .capnp 文件中导出别名,因此我不能只在那里定义一个浮点列表(或者看起来如此)。

有人可以告诉我在 pycapnp 中读取、写入和创建基本对象列表的正确语法吗?


编辑:

例如,在 C++ 中,我可以像这样创建一个列表对象(没有自定义类型):