El responsable de connexió
Introducció
El gestor de connexió és la primera peça de les funcions de chat de grup. Aquesta classe gestiona connexions amb pares i ofereix a l’usuari sockets multiplexats als dispositius que volen connectar. Per exemple, si Alice vol estar connectada a un dels dispositius de Bob per transferir 2 arxius, demanarà al ConnectionManager que obri 2 canals (un per arxiu) a Bob. Això donarà:
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
}
});
Després d’això, el ConnectionManager primer es connectarà al dispositiu de Bob a través del DHT (a través de ICE) i configurarà un TLS Socket. Després, demanarà un canal, i quan el canal estigui preparat, informeu Alice a través d’un callback. Per al segon arxiu, utilitzarà el primer socket i només obrirà un nou canal (s’necessiten només 2 paquets TLS, així que és ràpid)
Llat DHT
És el mateix que Trucades, veure Exchange ICE candidates, ICE negociació, Encriure el socket de control però només en TCP.
No obstant això, quan una part rebi una nova petició ICE, s’activa la devolució de la convocatòria establerta per null onICERequest(onICERequestCallback&&& cb);
.
Negociar un nou canal
Un canal es defineix per un id (únic) i un uri (no únic). Per exemple (1, “git://*”)
Quan està preparat, el ConnectionManager considera que el canal 0 existeix. Aquest canal s’anomena canal CONTROL i s’utilitza per demanar nous canals.
El protocol utilitzat és bastant senzill i sembla al protocol RTP:
16 bits s’utilitzen per emmagatzemar la longitud del cos.
16 bits per a la identificació de canal (destinació)
còpia
Així que tots els paquets tenen un len header de 32 bits.
Per demanar un nou canal, el ConnectionManager enviarà un ChannelRequest
objecte (msgpack s’utilitza per serialitzar l’estructura) en el canal 0 per enviar l’id i el nom del nou canal al peer (amb isAnswer = false
).
Tancament d’un canal
Una EOF es transmet per a un canal si la longitud del contingut és 0.
Estrutura de la connexióGestió
Propietat
Un JamiAccount és propietari del ConnectionManager i té accés als objectes ChannelSocket (shared_ptr propietat del MultiplexedSocket.
El ConnectionManager és propietari d’objectes MultiplexedSockets i ICE
MultiplexedSockets és propietari del transport TLS i els objectes ChannelSocket
ChannelSocket és propietari dels buffers de dades
Rols
ConnectionManager s’utilitza per gestionar connexions amb pares.
MultiplexedSockets s’utilitzen per enviar dades a través del TLSSocket, llegir els paquets entrants i gestionar canals.
ChannelSockets són utilitzats pel client per interactuar amb l’altre company.
Utilització
Els escenaris es descriuen en les proves unitàries corresponents (test/unitTest/connectionManager/connectionManager.cpp
)