Forbindelseslederen

Indledning

Forbindelsesadministratoren er det første stykke af gruppeklets funktioner. Denne klasse administrerer forbindelser til kammerater og tilbyder brugeren multiplexede sockets til enheder, de ønsker at forbinde. For eksempel, hvis Alice ønsker at blive forbundet til en af Bobs enheder for at overføre 2 filer, vil hun bede ConnectionManager om at åbne 2 kanaler (en per fil) til Bob. Dette vil give:

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

Bag det vil ConnectionManager først forbinde til Bobs enhed via DHT (via ICE) og oprette en TLS Socket. derefter vil det bede om en kanal, og når kanalen er klar, informer Alice via en tilbagekaldelse. For den anden fil, vil den bruge den første socket og vil bare åbne en ny kanal (kun behøver 2 TLS pakker, så det er hurtigt)

DHT side

Det er det samme som call, se Exchange ICE kandidater, ICE forhandling, Enkriptere kontrol socket men kun i TCP.

Når en part modtager en ny ICE-anmodning, udløses imidlertid den tilbagekaldelse, der er fastsat ved null onICERequest(onICERequestCallback&&& cb);.

At forhandle om en ny kanal

En kanal defineres ved en id (unique) og en uri (ikke unik).

Når ConnectionManager er klar, finder man, at kanal 0 eksisterer. Denne kanal kaldes CONTROL-kanalen og bruges til at bede om nye kanaler.

Det anvendte protokoll er ret enkelt og ligner RTP-protokollen:

  1. 16 bits bruges til at gemme kropslengden.

  2. 16 bits for kanal-id (mål)

  3. organ

Alle pakker har en 32-bit len-header.

For at anmode om en ny kanal sender ConnectionManager et ChannelRequest objekt (msgpack bruges til at serialisere strukturen) i kanal 0 for at sende id og navnet på den nye kanal til peeren (med isAnswer = false). Peeren ringer tilbage til opkaldet med ̀ void påChannelRequest(ChannelRequestCallBack&&& cb); og vil afvise eller acceptere anmodningen. Hvis accepteret, svarer peeren med en ChannelRequest med de samme data (og ̀isAnswer = true`) og derefter vil begge peers opkald blive udløst for at informere om, at ChannelSock er anvendelig.

Lukning af en kanal

En EOF sendes til en kanal, hvis indholdets længde er 0.

Forbindelsesstruktur

Ejer

  1. En JamiAccount ejer ConnectionManager og har adgang til ChannelSocket-objekter (shared_ptr ejet med MultiplexedSocket.

  2. ConnectionManager ejer MultiplexedSockets og ICE-objekter

  3. MultiplexedSockets ejer TLS transport og ChannelSocket objekter

  4. ChannelSocket ejer databufferne

Roller

  1. ConnectionManager bruges til at administrere forbindelser til kolleger.

  2. MultiplexedSockets bruges til at sende data over TLSSocket, læse indgående pakker og administrere kanaler.

  3. ChannelSockets bruges af klienten til at interagere med den anden peer.

Brugen

Scenarier beskrives i de tilsvarende enhedstester (test/unitTest/connectionManager/connectionManager.cpp)