La konektadministracio

Enkonduko

La konektigadministranto estas la unua peco de la grupĉatfunkcioj. Tiu klaso administras konektojn al kunuloj kaj ofertas al la uzanto multipleksitajn socketon al la aparatoj kiujn ili volas konekti. Ekzemple, se Alice volas esti konektita al unu el la aparatoj de Bob por transdoni 2 dosierojn, ŝi petos la Konektigadministranto malfermi 2 kanalojn (unu por dosiero) al Bob. Tio donos:

    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
        }
    });

Post tio, la ConnectionManager unue konektiĝos al la aparato de Bob per la DHT (per ICE) kaj instalos TLS-Socket. Poste, ĝi petos kanalon, kaj kiam la kanalo estos preta, informu Alice per alvoko. Por la dua dosiero, ĝi uzos la unuan socket kaj nur malfermos novan kanalon (nur bezonas 2 TLS-paketojn, do ĝi estas rapida)

DHT flanko

Ĝi estas la sama kiel call, vidu Echange ICE kandidatoj, ICE negocado, Enkripti la kontrolsocket sed nur en TCP.

Tamen, kiam unu flanko ricevas novan ICE-peto, la revokado fiksita per nul onICERequest(onICERequestCallback&&& cb); estas ekfunkciigita.

Negociado pri nova kanalo

Kanalo estas difinita per id (unique) kaj uri (ne unika). Ekzemple (1, ‘git://*’)

Kiam ĝi estas preta, la ConnectionManager konsideras, ke la kanalo 0 ekzistas. Tiu kanalo nomiĝas la CONTROL kanalo kaj estas uzata por peti novajn kanalojn.

La protokolo uzata estas tre simpla kaj aspektas kiel la RTP-protokolo:

  1. 16 bitoj estas uzataj por stoki la longon de la korpo.

  2. 16 bitoj por la kanalo id (cestinado)

  3. korpo

Do ĉiuj pakaĵoj havas 32-bitan len-header.

Por peti novan kanalon, la ConnectionManager sendos ChannelRequest objekton (msgpack estas uzita por seriigi la strukturon) en la kanalo 0 por sendi la id kaj la nomon de la nova kanalo al la samulo (kun isAnswer = false). La samulo vokos la revokadon donitan kun ̀ void onChannelRequest(ChannelRequestCallBack&&& cb); kaj rifuzos akceptos la peton. Se akceptita, la samulo respondos per ChannelRequest kun la samaj datumoj (kaj ̀isAnswer = true`) kaj tiam ambaŭ samuloj revenos por informi, ke la ChannelSock estas uzebla.

Fermo de kanalo

EOF estas sendita por kanalo se la longo de la enhavo estas 0.

Strukturon de la konekto

Posedaĵo

  1. JamiAccount posedas la ConnectionManager kaj havas aliron al la ChannelSocket objektoj (shared_ptr posedata kun la MultiplexedSocket.

  2. La ConnectionManager posedas MultiplexedSockets kaj ICE objektojn

  3. MultiplexedSockets posedas la TLS-transporto kaj la ChannelSocket objektoj

  4. ChannelSocket posedas la datumbaŭferojn

Roloj

  1. ConnectionManager estas uzata por administri konektojn al samuloj.

  2. MultiplexedSockets estas uzita por sendi datumojn tra la TLSSocket, legi la alvenantajn paketojn kaj administri kanalojn.

  3. ChannelSockets estas uzata de la kliento por interagi kun la alia samulo.

Uzo

Scenaroj estas priskribitaj en la ekvivalentaj unuotestaĵoj (test/unitTest/connectionManager/connectionManager.cpp)