Lotura-zuzendaria.
Aurkezpena
Lotura kudeatzailea talde-txat-funtzioen lehenengo pieza da. Klase honek lagunekin loturak kudeatzen ditu eta erabiltzaileari konektatu nahi dituzten gailuetara sokete multiplexatuak eskaintzen dizkio. Adibidez, Alice-k Bob-en gailu batekin konektatu nahi badu 2 fitxategi transferitzeko, ConnectionManager-ari Bob-i 2 kanala irekitzeko eskatuko dio. Honek emango dio:
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
}
});
Horren atzean, ConnectionManager-ek Bob-en gailuarekin konektatuko du DHT bidez (ICE bidez) eta TLS Socket bat ezarriko du. Ondoren, kanala eskatuko du, eta kanala prest dagoenean, Alice-ri abisatu deitzeko dei baten bidez. Bigarren fitxategiarentzat, lehen socket-a erabiliko du eta kanala berria zabalduko du (TLS pakete 2 bakarrik behar dira, beraz azkarra da)
DHT aldean
call, ikus Exchange ICE hautagaiak, ICE negoziazioa, Encrypt control soketa baina TCP bakarrik.
Alde batek ICEren eskaera berria jasotzen duenean, ordea, null onICERequest(onICERequestCallback&&& cb);
-k ezarritako atzera-deialdia aktibatzen da.
Kanal berri bat negoziatzen
Kanala id (unique) eta uri (ez-unique) bidez definitzen da. Adibidez (1, ‹git://*›)
Prest dagoenean, ConnectionManagerrek 0 kanala existitzen dela uste du.
Erabilitako protokoloa nahiko sinplea da eta RTP protokoloa dirudi:
Gorputzaren luzera gordetzeko 16 bit erabiltzen dira.
16 bits kanal id (destinazioa)
gorputza
Pakete guztiek 32 biteko len-header bat dute.
Kanale berri bat eskatzeko, ConnectionManagerrek ChannelRequest
objektu bat bidaliko du 0 kanalean (msgpack egitura sekuentziatzeko erabiltzen da) kanal berriaren id eta izena bidaltzeko ( isAnswer = false
).
Kanal bat itxi
EOF bat igortzen da kanala baten barruan, edukia 0 bada.
Lotura egitura
Jabetza
JamiAccount batek ConnectionManagerra du eta ChannelSocket objektuetara sarbidea du (shared_ptr MultiplexedSocket-ekin partekatzen da.
ConnectionManagerrek MultiplexedSockets eta ICE objektuak ditu
MultiplexedSocketsek TLS garraioaren eta ChannelSocket objektuen jabea da
ChannelSocket-ek du datu-bufferra.
Rolrak
ConnectionManager erabiltzen da lagunekin loturak kudeatzeko.
MultiplexedSockets erabiltzen dira datuak bidaltzeko TLSSocket bidez, datozen paketeak irakurtzeko eta kanalak kudeatzeko.
ChannelSockets bezeroak erabiltzen ditu beste lagun batekin interakzioan jartzeko.
Erabilera
Eszenarioak deskribatu dira unitate-proba dagokienetan (test/unitTest/connectionManager/connectionManager.cpp
)