连接管理员

引言

连接管理器是群体聊天功能的第一部分.这个类管理对等的连接,并向用户提供多重插座,用于他们想连接的设备.例如,如果爱丽丝想连接到Bob的设备之一,将传输2个文件,她将要求连接管理器向Bob打开2个频道 (每个文件一个).这将给出:

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file1",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer first file
        }
    });

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file2",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer second file
        }
    });

在此之后,连接管理器首先通过DHT连接到Bob的设备 (通过ICE) 并设置TLS Socket.然后,它会要求一个频道,当频道准备好时,通过回调通知Alice.对于第二个文件,它将使用第一个插座,然后将打开一个新的频道 (只需要2个TLS包,所以很快)

它们与 call相同,请见 Exchange ICE候选人, ICE谈判, 加密控制插座,但只有TCP.

然而,当一个方收到新的ICE请求时,由 无效onICERequest(onICERequestCallback&&& cb);设置的回调会触发.

谈判一个新的道

频道由 id (唯一) 和 uri (非唯一) 定义.例如 (1, ‘git://*’)

连接管理器在准备时认为频道0已经存在.这个频道被称为CONTROL频道,用于请求新的频道.

使用的协议非常简单,看起来像RTP协议:

  1. 为了存储身体长度,使用16位.

  2. 频道ID (目的地) 的16位

  3. 身体

所有的包都具有32位的 len头.

为了请求新频道,连接管理员将在频道0中发送一个 ChannelRequest对象 (msgpack用于串行结构) 来向同行发送新频道的 id 和名称 (有 isAnswer = false).同行将在ChannelRequest上通过 ̀ void () 调回道.

关闭一个道

如果内容长度为0则,则将为频道发送EOF

连接结构管理器

拥有权

  1. 一个JamiAccount拥有连接管理器,并可以访问ChannelSocket对象 (共享_ptr与多复式Socket拥有.

  2. 连接管理器拥有多个Sockets和ICE对象

  3. 复式Sockets拥有TLS运输和ChannelSocket对象

  4. 道Socket拥有数据缓冲器

角色

  1. 连接管理器用于管理与同行的连接.

  2. 通过TLSSocket发送数据,阅读接入的包,管理道使用MultiplexedSockets.

  3. 客户端使用ChannelSockets与其它同行进行互动.

使用

相关单元测试中描述了场景 (test/unitTest/connectionManager/connectionManager.cpp)