Správca spojenia

Úvod

Správca pripojenia je prvým prvkom funkcií skupinového chatu. Táto trieda spravuje pripojenia k rovníkom a ponúka používateľovi multiplexované zásuvky k zariadeniam, ktoré chcú pripojiť. Napríklad, ak chce Alice byť pripojená k niektorému z zariadení Boba na prenos 2 súborov, požiada ConnectionManagera, aby otvoril 2 kanály (jedna za súbor) Bobovi.

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

Za tým ConnectionManager najprv pripojí k Bobovu zariadeniu cez DHT (prostredníctvom ICE) a nastaví TLS Socket. Potom požiada o kanál a keď je kanál pripravený, informujte Alice prostredníctvom spätného volania. Pre druhý súbor použije prvý socket a otvorí nový kanál (potrebuje len 2 balíky TLS, takže je to rýchle)

DHT strana

Je to rovnaké ako call, pozri Exchange ICE kandidátov, ICE rokovania, Encrypt ovládací zásuvku ale len v TCP.

Ak však strana dostane novú žiadosť ICE, spustí sa spätné volanie nastavené void onICERequest(onICERequestCallback&&& cb);.

Vyjednávanie o novom kanáli

Kanál je definovaný identifikáciou (unik) a uri (nie unikátnym).

Keď je pripravený, ConnectionManager považuje, že existoval kanál 0. Tento kanál sa nazýva kanál CONTROL a používa sa na požiadanie o nové kanály.

Používaný protokol je pomerne jednoduchý a vyzerá ako protokol RTP:

  1. 16 bitov sa používa na ukladanie dĺžky tela.

  2. 16 bitov pre identifikátor kanálu (určenie)

  3. telo

Takže všetky balíky majú 32-bitový len header.

Ak chcete požiadať o nový kanál, ConnectionManager pošle objekt ChannelRequest (msgpack sa používa na sérializáciu štruktúry) v kanáli 0 na odoslanie ID a názvu nového kanálu peeru (s isAnswer = false). Peer zavolá spätné volanie, ktoré je dané s ̀ void naChannelRequest(ChannelRequestCallBack&&& cb); a odmietne alebo prijme žiadosť. Ak bude prijatá, peer odpovedá s ChannelRequest s rovnakými údajmi (a ̀isAnswer = true`) a potom sa spustí oba peer callbacks informovať, že ChannelSock je použiteľný.

Zatvorenie kanálu

EOF sa prenáša pre kanál, ak je dĺžka obsahu 0.

Struktúra pripojeniaManager

Vlastníctvo

  1. Ako sa uvádza v článku 1 písm. a) a b) sa tieto údaje môžu použiť na účely výpočtu údajov.

  2. ConnectionManager vlastní objekty MultiplexedSockets a ICE

  3. MultiplexedSockets vlastní transport TLS a objekty ChannelSocket

  4. ChannelSocket vlastní data buffery

Úlohy

  1. ConnectionManager sa používa na správu spojení s rovnocennými osobami.

  2. MultiplexedSockets sa používajú na odoslanie údajov cez TLSSocket, čítanie prichádzajúcich balíkov a správu kanálov.

  3. ChannelSockets používa klient na interakciu s druhým rovnocenným.

Použitie

Scenáre sú opísané v príslušných jednotkových testoch (test/unitTest/connectionManager/connectionManager.cpp)