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:
16 bitov sa používa na ukladanie dĺžky tela.
16 bitov pre identifikátor kanálu (určenie)
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
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.
ConnectionManager vlastní objekty MultiplexedSockets a ICE
MultiplexedSockets vlastní transport TLS a objekty ChannelSocket
ChannelSocket vlastní data buffery
Úlohy
ConnectionManager sa používa na správu spojení s rovnocennými osobami.
MultiplexedSockets sa používajú na odoslanie údajov cez TLSSocket, čítanie prichádzajúcich balíkov a správu kanálov.
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
)