A kapcsolatkezelő
Bevezetés
A kapcsolatkezelő a csoportcsata funkciók első része. Ez a osztály kezel a társaival való kapcsolatokat és a felhasználónak multiplexed sokketeket kínál a csatlakoztatni kívánt eszközökhöz. Például, ha Alice 2 fájlt átvitelre Bob egyik eszközehez szeretne csatlakozni, megkérheti a ConnectionManager-t, hogy kinyiss 2 csatornát (egy fájlt egy fájlt egy) Bobnak. Ez megadja:
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
}
});
A ConnectionManager először csatlakozik Bob eszközehez a DHT-en keresztül (ICE-en keresztül) és beállít egy TLS-csatornát.
DHT oldal
Ez ugyanaz, mint a call, lásd Exchange ICE jelölteket, ICE tárgyalás, Encrypt a vezérlőszögből de csak TCP.
Ha azonban egy fél új ICE-kérelmet kap, a null onICERequest(onICERequestCallback&&& cb);
által megadott visszahívást indítják.
Egy új csatornát tárgyalnak.
A csatornát egy id (egységes) és egy uri (nem egyedi) határozza meg. Például (1, «git://*»)
A ConnectionManager készenlétét követően úgy véli, hogy a 0 csatorna létezik.
A protokoll elég egyszerű és hasonlít az RTP protokollra:
A test hosszának tárolására 16 bitet használnak.
16 bites csatornázat (meghatározás)
test
Tehát minden csomagban van egy 32 bites len fejleíró.
Az új csatornát kérni a ConnectionManager egy ChannelRequest
objektumot küld (a struct szériázásához a msgpackot használják) a 0 csatornában, hogy az új csatornát id és névvel küldje a társának (a isAnswer = false
). A társ a csatornán megadott hang visszahívást ̀ void onChannelRequest(ChannelRequestCallBack&&& cb); és visszautasítja vagy elfogadja a kérelmet. Ha elfogadott, a társ ugyanazon adatokkal a ChannelRequest-rel válaszol (és ̀
isAnswer = true`) és akkor mindkét társ visszahívást indítanak, hogy tájékoztassák, hogy a ChannelSock használható.
Egy csatorna lezárása
A EOF csatornák esetében továbbítjuk, ha a tartalom hossza 0.
A csatlakozás szerkezeteManager
Üzleti jog
Egy JamiAccount tulajdonosa a ConnectionManagernek, és hozzáférhet a ChannelSocket objektumokra (a MultiplexedSocket tulajdonában lévő shared_ptr).
A ConnectionManager tulajdonosa a MultiplexedSockets és az ICE objektumoknak
A MultiplexedSockets tulajdonosa a TLS szállításnak és a ChannelSocket objektumoknak
A ChannelSocket tulajdonosa a adatpuffereknek
Figyelem
A ConnectionManager a társaival való kapcsolatok kezelésére szolgál.
A MultiplexedSockets-ot a TLSSocket-en keresztül adatküldésre, a beérkező csomagok olvasására és a csatornákat kezelésére használják.
A ChannelSockets-ot a kliens használja a másik társsal való interakcióhoz.
Használat
A szzenáriumokat a megfelelő egységes tesztekben (test/unitTest/connectionManager/connectionManager.cpp
) leírják.