De verbindingsmanager
Inleiding
De verbindingsbeheerder is het eerste deel van de groepchatfuncties. Deze klasse beheert verbindingen met collega’s en biedt de gebruiker multiplexde soketten aan apparaten die hij wil verbinden. Als Alice bijvoorbeeld wil worden verbonden met een van Bob’s apparaten om 2 bestanden over te dragen, zal ze de ConnectionManager vragen om 2 kanalen (één per bestand) te openen aan Bob.
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
}
});
Daarnaast zal de ConnectionManager eerst via de DHT (via ICE) verbinding maken met Bobs apparaat en een TLS-socket instellen.
DHT zijde
Het is hetzelfde als call, zie Exchange ICE kandidaten, ICE onderhandeling, Encrypt de controle-spook maar alleen in TCP.
Wanneer een partij echter een nieuw ICE-verzoek ontvangt, wordt de terugroeping ingesteld die is ingesteld door null onICERequest(onICERequestCallback&&& cb);
.
Onderhandelen over een nieuw kanaal
Een kanaal wordt gedefinieerd door een id (uniek) en een uri (niet uniek).
Wanneer het is klaar, beschouwt de ConnectionManager dat het kanaal 0 bestaat.
Het protocol is vrij eenvoudig en lijkt op het RTP-protocol:
16 bits worden gebruikt om de lengte van het lichaam te opslaan.
16 bits voor de kanaal-id (bestemming)
lichaam
Alle pakketten hebben een 32-bit len header.
Om een nieuw kanaal te vragen, stuurt de ConnectionManager een ChannelRequest
object (msgpack wordt gebruikt om de struct te seriealiseren) in kanaal 0 om de id en de naam van het nieuwe kanaal naar de peer te sturen (met isAnswer = false
).
Een kanaal sluiten
Een EOF wordt voor een kanaal verzonden indien de inhoud van de inhoud 0 is.
Structuur van de verbindingManager
Eigendom
Een JamiAccount bezit de ConnectionManager en heeft toegang tot de ChannelSocket-objecten (shared_ptr eigendom van de MultiplexedSocket.
De ConnectionManager bezit MultiplexedSockets en ICE-objecten
MultiplexedSockets bezit het TLS-transport en de ChannelSocket-objecten
ChannelSocket bezit de databuffers
Rol
ConnectionManager wordt gebruikt om verbindingen met collega’s te beheren.
MultiplexedSockets worden gebruikt om gegevens via de TLSSocket te verzenden, de inkomende pakketten te lezen en kanalen te beheren.
ChannelSockets worden door de cliënt gebruikt om met de andere collega te communiceren.
Gebruik
Scenario’s worden beschreven in de overeenkomstige testproeven (test/unitTest/connectionManager/connectionManager.cpp
)