Zarządca połączeń
Wprowadzenie
Jeśli Alice chce być podłączona do jednego z urządzeń Boba, aby przenieść 2 pliki, poprowadzi ConnectionManager do otwarcia 2 kanałów (jeden na plik).
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
}
});
Za tym ConnectionManager połączy się najpierw z urządzeniem Boba za pośrednictwem DHT (za pośrednictwem ICE) i ustawi TLS Socket. Następnie poprosi o kanał, a gdy kanał będzie gotowy, poinformuj Alice za pośrednictwem oddzwania.
Strona DHT
Jest to samo co call, patrz Exchange ICE kandydatów, ICE negocjacje, Encrypt kontrolny zasłony ale tylko w TCP.
Jednakże, gdy strona otrzymuje nowe wniosek ICE, uruchomi się odwołanie ustawione przez null onICERequest(onICERequestCallback&&& cb);
.
Negocjacje o nowym kanale
Kanał jest zdefiniowany przez id (uniek) i uri (nie unikatowy).
W przypadku gdy jest gotowy, ConnectionManager uzna, że istnieje kanał 0. Kanał ten jest nazywany kanałem CONTROL i jest używany do żądania nowych kanałów.
Protokół jest prosty i wygląda jak protokoł RTP:
16 bitów jest używane do przechowywania długości ciała.
16 bitów dla identyfikatoru kanału (wybiór)
ciało
Wszystkie pakiety mają 32-bitny len header.
Aby poprosić o nowy kanał, ConnectionManager wysyła obiekt ChannelRequest
(msgpack jest używany do serializacji struktury) w kanale 0 w celu wysłania id i nazwy nowego kanału do rówieśnika (z isAnswer = false
). Rówieśnik połączy z powrotem połączenie, które zostało podane z ̀ void onChannelRequest(ChannelRequestCallBack&&& cb);` i odmówi lub zaakceptuje wniosek.
Zamknięcie kanału
W przypadku kanału przesyłany jest EOF w przypadku, gdy długość treści wynosi 0.
Struktura połączeniaManager
Właściciel
Konto Jami posiada ConnectionManager i ma dostęp do obiektów ChannelSocket (shared_ptr należący do MultiplexedSocket.
ConnectionManager posiada obiekty MultiplexedSockets i ICE
MultiplexedSockets posiada transport TLS i obiekty ChannelSocket
ChannelSocket jest właścicielem buforów danych
Role
ConnectionManager jest używany do zarządzania połączeniami z rówieśnikami.
MultiplexedSockets są wykorzystywane do wysyłania danych przez TLSSocket, odczytywania wchodzących pakietów i zarządzania kanałami.
ChannelSockets są używane przez klienta do interakcji z innym rówieśnikiem.
Użycie
Scenariusze opisane są w odpowiednich testach jednostkowych (test/unitTest/connectionManager/connectionManager.cpp
)