Der Verbindungsmanager

Einführung

Der Verbindungsmanager ist das erste Stück der Gruppen-Chat-Funktionen. Diese Klasse verwaltet Verbindungen zu Peers und bietet dem Benutzer multiplexierte Sockets zu den Geräten an, die er verbinden möchte. Wenn Alice beispielsweise mit einem von Bobs Geräten verbunden werden möchte, um 2 Dateien zu übertragen, wird sie den ConnectionManager bitten, 2 Kanäle (einen pro Datei) an Bob zu öffnen. Dies wird geben:

    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
        }
    });

Hinter diesem wird der ConnectionManager zunächst über die DHT (über das ICE) mit Bobs Gerät verbinden und ein TLS-Socket einrichten. Dann wird er nach einem Kanal fragen und wenn der Kanal bereit ist, Alice über einen Callback informieren. Für die zweite Datei wird er die erste Steckdosis verwenden und einen neuen Kanal öffnen (nur 2 TLS-Pakete benötigt, also ist es schnell)

DHT-Seite

Es ist das gleiche wie call, siehe Austausch ICE-Kandidaten, ICE-Verhandlung, Encrypt die Steuerungssteckstelle, aber nur in TCP.

Wenn eine Partei jedoch eine neue ICE-Anfrage erhält, wird der Rückruf, der durch null onICERequest(onICERequestCallback&&& cb); festgelegt ist, ausgelöst.

Verhandlungen über einen neuen Kanal

Ein Kanal wird durch eine id (unique) und eine uri (nicht einzigartig) definiert.

Der ConnectionManager hält, dass der Kanal 0 vorhanden ist, wenn er bereit ist. Dieser Kanal wird als CONTROL-Kanal bezeichnet und wird verwendet, um nach neuen Kanälen zu fragen.

Das verwendete Protokoll ist ziemlich einfach und sieht aus wie das RTP-Protokoll:

  1. 16 Bit werden verwendet, um die Länge des Körpers zu speichern.

  2. 16 Bit für die Kanal-ID (Ziel)

  3. Körper

Alle Pakete haben einen 32-Bit-Len-Header.

Um einen neuen Kanal zu beantragen, sendet der ConnectionManager ein ChannelRequest Objekt (msgpack wird verwendet, um die Struktur zu serialisieren) in Kanal 0 um die ID und den Namen des neuen Kanals an den Peer zu senden (mit isAnswer = false). Der Peer ruft den mit ̀ void aufChannelRequest gegebenen Callback an ((ChannelRequestCallBack&& cb); und lehnt oder akzeptiert die Anfrage ab. Wenn angenommen, antwortet der Peer mit einem ChannelRequest mit den gleichen Daten (und ̀isAnswer = true`) und dann werden beide Peer-Callbacks ausgelöst, um zu informieren, dass der ChannelSock nutzbar ist.

Schließung eines Kanals

Eine EOF wird für einen Kanal übertragen, wenn die Inhaltslänge 0 ist.

Struktur der VerbindungManager

Eigentumsrecht

  1. Ein JamiAccount besitzt den ConnectionManager und hat Zugriff auf die ChannelSocket-Objekte (shared_ptr im Besitz des MultiplexedSocket.

  2. Der ConnectionManager besitzt MultiplexedSockets und ICE-Objekte

  3. MultiplexedSockets besitzt den TLS-Transport und die ChannelSocket-Objekte

  4. ChannelSocket besitzt die Datenpuffer

Funktionen

  1. ConnectionManager wird verwendet, um Verbindungen zu Peers zu verwalten.

  2. MultiplexedSockets werden verwendet, um Daten über den TLSSocket zu senden, die eingehenden Pakete zu lesen und Kanäle zu verwalten.

  3. ChannelSockets werden vom Kunden verwendet, um mit dem anderen Peer zu interagieren.

Verwendung

Szenarien werden in den entsprechenden Einheitstests beschrieben (test/unitTest/connectionManager/connectionManager.cpp)