#dbus #async #async-version #connection #thread-safe #protocols #message

async-rustbus

基于 rustbus 的 DBus 协议的异步实现

3个不稳定版本

0.2.0 2023年8月13日
0.1.2 2021年8月12日
0.1.1 2021年7月13日

异步中排名第611


用于rustable

MIT 协议

210KB
4.5K SLoC

async-rustbus CI 测试

这个crate实现了与DBus交互的异步API。除了是异步的,它也是线程安全的,允许单个连接由多个线程使用。它基于KillingSpark的现有rustbus crate构建,并重用了其DBus线格式和消息协议的实现。使用非阻塞的rustbus的Conn重实现来构建RpcConn的异步版本。这个crate的RpcConn异步版本创建了一个异步API,用于连接到系统、会话和远程(TCP)DBus守护进程,发送消息,接收方法调用和信号。

此crate与rustbus之间的设计差异及其原因

虽然异步crate重用了父crate的消息格式,但在处理连接时,有一些设计决策与原始版本不同

  • 此crate中的大多数RpcConn函数返回std::io::Result而不是自定义错误类型。在发送/接收消息时,可能发生的错误是IO错误、(反)序列化错误和无效头。由于大多数用户通常与经过良好测试的DBus实现交互,因此(反)序列化错误很可能是我们实现中的错误引起的。反序列化错误通常被远程dbus-daemon捕获,导致断开连接,这会引发未来的std::io::Error。无效头和无效Fds也可能是错误来源,但通常是用户端的错误,应该通过错误修复来解决;它们不需要在运行时处理。这实际上只留下了需要运行时处理的IO错误。其他错误是传播自定义的std::io::Error

  • 当出现协议违规时,此crate终止连接(原始版本允许尝试恢复)。当出现协议违规时,没有安全且一致的方法可以恢复。虽然保持连接开放对调试可能有所帮助,但对于crate的用户来说通常是无用的。此外,DBus规范也指定不应尝试恢复

出于安全原因,D-Bus协议应严格解析和验证,除非是定义的扩展点。任何无效的协议或规范违规都应导致立即无通知地断开连接。

  • 异步版本提供了比原始版本更多的消息处理机制。这一功能主要是为了提高效率,并使异步RpcConn在多个不同的线程中更容易使用,而无需在接收消息时相互协调。

    • 原始crate要求用户手动等待响应。在此crate中创建方法调用时,此crate提供了一个返回另一个Future的Future。外部Future发送消息,嵌套Future检索响应。如果嵌套Future被丢弃,则响应将被忽略并适当清理。
    • 传入的方法调用被排序到一个MsgQueue的层次结构中。这样做是为了允许不同的线程轻松地检索它们感兴趣的路径空间中的调用(使用get_call())。层次结构还可以提供对一些Introspect调用的基本处理。
    • 还提供了一个过滤信号的机制。各个线程可以注册匹配项(使用insert_sig_match()),以允许检索线程感兴趣的信号。此调用还处理发送到DBus守护进程的AddMatch调用。当RpcConn接收到信号时,它们将根据其特定规则提供的顺序与每个匹配项进行比较(有关排序的详细信息,请参阅async_rustbus::Match)。第一个匹配的规则将信号添加到其队列中,稍后由感兴趣的线程(使用get_signal())检索。
  • 此crate的RpcConn在连接时发送并等待DBus问候消息。原始版本要求您手动处理此消息和响应。

  • 此crate支持TCP流以连接到远程服务器。注意: TCP流是不加密的,应使用SSH-tunnel或其他方式。

  • 原始crate允许对信息写入和从套接字接收的方式有更细粒度的控制,包括设置超时和选择何时填充缓冲区。异步功能通常通过抽象非阻塞系统调用来消除对此类操作的必要性。

状态

此crate尚未发布,仍需文档,但大多数功能已实现。信号实现尚未验证,但其他一切均正常运行。

依赖项

~7–16MB
~205K SLoC