Upravljavec povezave
Vvod
Upravljavec povezave je prvi del funkcij skupinskega klepetanja. Ta razred upravlja povezave z vrstniki in uporabniku ponuja multipleksirane sočete na naprave, ki jih želijo povezati. Na primer, če želi Alice biti povezana z eno Bobovo napravo za prenos 2 datotek, bo prosila ConnectionManager, da bo odprl 2 kanali (en na datoteko).
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 tem se ConnectionManager najprej poveže z Bobovim napravom prek DHT (v ICE) in nastavi TLS Socket. Potem bo prosil za kanal, ko je kanal pripravljen, obvesti Alice prek povratnega klica. Za drugo datoteko bo uporabil prvo socket in odprl samo nov kanal (potrebuje samo 2 pakete TLS, zato je hitro)
DHT strani
To je enako kot call, glej Echange ICE kandidati, ICE pogajanja, Encrypt nadzorno stikalo, vendar samo v TCP.
Vendar, ko stranka prejme novo zahtevo ICE, se sproži povratni poziv, ki je določen z null onICERequest(onICERequestCallback&&& cb);
.
Pregovarjanje o novem kanali
Kanal je opredeljen s identifikacijo (unikalno) in uri (ne edinstveno).
Ko je pripravljen, ConnectionManager meni, da kanal 0 obstaja. Ta kanal se imenuje kanal CONTROL in se uporablja za zahtevanje novih kanalov.
Uporabljeni protokol je precej preprost in izgleda kot protokol RTP:
16 bitov se uporablja za shranjevanje dolžine telesa.
16 bitov za identifikacijo kanala (pohod)
telo
Vsi paketi imajo 32-bitni len-header.
Za zahtevo novega kanala, ConnectionManager pošlje objekt ChannelRequest
(msgpack se uporablja za serializacijo strukture) v kanali 0 za pošiljanje ID in imena novega kanala na partnerja (z isAnswer = false
).
Zapiranje kanala
EOF se prenaša za kanal, če je dolžina vsebine 0.
Struktura povezaveManager
Lastništvo
JamiAccount je lastnik ConnectionManagerja in ima dostop do objektov ChannelSocket (shared_ptr, ki so v lasti MultiplexedSocketja).
ConnectionManager je lastnik objektov MultiplexedSockets in ICE
MultiplexedSockets je lastnik TLS prevoza in ChannelSocket objektov
ChannelSocket je lastnik podatkovnih rezervoarjev
Vloga
ConnectionManager se uporablja za upravljanje povezav z vrstniki.
MultiplexedSockets se uporablja za pošiljanje podatkov preko TLSSocket, branje prihodnjih paketov in upravljanje kanalov.
ChannelSockets uporablja stranka za interakcijo z drugim vrstnikom.
Uporaba
Scenariji so opisani v ustreznih enotnih preskusih (test/unitTest/connectionManager/connectionManager.cpp
)