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:
16 bitoj estas uzataj por stoki la longon de la korpo.
16 bitoj por la kanalo id (cestinado)
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 aŭ 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
JamiAccount posedas la ConnectionManager kaj havas aliron al la ChannelSocket objektoj (shared_ptr posedata kun la MultiplexedSocket.
La ConnectionManager posedas MultiplexedSockets kaj ICE objektojn
MultiplexedSockets posedas la TLS-transporto kaj la ChannelSocket objektoj
ChannelSocket posedas la datumbaŭferojn
Roloj
ConnectionManager estas uzata por administri konektojn al samuloj.
MultiplexedSockets estas uzita por sendi datumojn tra la TLSSocket, legi la alvenantajn paketojn kaj administri kanalojn.
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
)