Förbindelsechefen
Inledning
Anslutningshanteraren är den första delen av grupptchatfunktionen. Denna klass hanterar anslutningar till kamrater och erbjuder användaren multiplexerade sockets till enheter som de vill ansluta. Till exempel, om Alice vill ansluta till en av Bobs enheter för att överföra 2 filer, kommer hon att be anslutningshanteraren att öppna 2 kanaler (en per fil) till Bob. Detta kommer att ge:
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
}
});
Efter det kommer ConnectionManager först att ansluta till Bobs enhet via DHT (via ICE) och ställa in en TLS-paket. Sedan kommer den att be om en kanal, och när kanalen är redo, informera Alice via en återkallelse. För den andra filen kommer den att använda den första socket och kommer bara att öppna en ny kanal (bara behöver 2 TLS-paket, så det är snabbt)
DHT-sida
Det är samma som call, se Exchange ICE kandidater, ICE förhandling, Enkriptera kontroll socket men endast i TCP.
När en part dock får en ny ICE-förfrågan utlöses återkallelsen som anges av null onICERequest(onICERequestCallback&&& cb);
.
Förhandla om en ny kanal
En kanal definieras av en id (unikt) och en uri (inte unik).
När ConnectionManager är klar anser han att kanalen 0 finns.
Det används ett ganska enkelt protokoll som liknar RTP-protokollet.
16 bit används för att lagra längden på kroppen.
16 bits för kanalid (mål)
organ
Alla paket har en 32-bitars len-header.
För att be om en ny kanal skickar ConnectionManager ett ChannelRequest
objekt (msgpack används för att serialisera strukturen) i kanal 0 för att skicka id och namnet på den nya kanalen till pearen (med isAnswer = false
). Pearen kommer att ringa tillbaka det samtal som ges med ̀ void påChannelRequest(ChannelRequestCallBack&&& cb); och kommer att neka eller acceptera begäran. Om accepterat, kommer pearen att svara med en ChannelRequest med samma data (och ̀
isAnswer = true`) och sedan kommer båda pearerna att utlösas tillbaka samtal för att informera om att ChannelSock är användbar.
Stäng en kanal
En EOF sänds för en kanal om innehållets längd är 0.
Anslutningsstruktur
Ägare
Ett JamiAccount äger ConnectionManager och har tillgång till ChannelSocket-objekten (shared_ptr ägs med MultiplexedSocket.
ConnectionManager äger MultiplexedSockets och ICE-objekt
MultiplexedSockets äger TLS-transporten och ChannelSocket-objekten
ChannelSocket äger databuffrarna
Uppdrag
ConnectionManager används för att hantera kontakter till kamrater.
MultiplexedSockets används för att skicka data över TLSSocket, läsa inkommande paket och hantera kanaler.
ChannelSockets används av kunden för att interagera med den andra kamrat.
Användning
Scenarier beskrivs i de motsvarande enhetstestarna (test/unitTest/connectionManager/connectionManager.cpp
)