A kapcsolatkezelő

Bevezetés

A kapcsolatkezelő a csoportcsata funkciók első része. Ez a osztály kezel a társaival való kapcsolatokat és a felhasználónak multiplexed sokketeket kínál a csatlakoztatni kívánt eszközökhöz. Például, ha Alice 2 fájlt átvitelre Bob egyik eszközehez szeretne csatlakozni, megkérheti a ConnectionManager-t, hogy kinyiss 2 csatornát (egy fájlt egy fájlt egy) Bobnak. Ez megadja:

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

A ConnectionManager először csatlakozik Bob eszközehez a DHT-en keresztül (ICE-en keresztül) és beállít egy TLS-csatornát.

DHT oldal

Ez ugyanaz, mint a call, lásd Exchange ICE jelölteket, ICE tárgyalás, Encrypt a vezérlőszögből de csak TCP.

Ha azonban egy fél új ICE-kérelmet kap, a null onICERequest(onICERequestCallback&&& cb); által megadott visszahívást indítják.

Egy új csatornát tárgyalnak.

A csatornát egy id (egységes) és egy uri (nem egyedi) határozza meg. Például (1, «git://*»)

A ConnectionManager készenlétét követően úgy véli, hogy a 0 csatorna létezik.

A protokoll elég egyszerű és hasonlít az RTP protokollra:

  1. A test hosszának tárolására 16 bitet használnak.

  2. 16 bites csatornázat (meghatározás)

  3. test

Tehát minden csomagban van egy 32 bites len fejleíró.

Az új csatornát kérni a ConnectionManager egy ChannelRequest objektumot küld (a struct szériázásához a msgpackot használják) a 0 csatornában, hogy az új csatornát id és névvel küldje a társának (a isAnswer = false). A társ a csatornán megadott hang visszahívást ̀ void onChannelRequest(ChannelRequestCallBack&&& cb); és visszautasítja vagy elfogadja a kérelmet. Ha elfogadott, a társ ugyanazon adatokkal a ChannelRequest-rel válaszol (és ̀isAnswer = true`) és akkor mindkét társ visszahívást indítanak, hogy tájékoztassák, hogy a ChannelSock használható.

Egy csatorna lezárása

A EOF csatornák esetében továbbítjuk, ha a tartalom hossza 0.

A csatlakozás szerkezeteManager

Üzleti jog

  1. Egy JamiAccount tulajdonosa a ConnectionManagernek, és hozzáférhet a ChannelSocket objektumokra (a MultiplexedSocket tulajdonában lévő shared_ptr).

  2. A ConnectionManager tulajdonosa a MultiplexedSockets és az ICE objektumoknak

  3. A MultiplexedSockets tulajdonosa a TLS szállításnak és a ChannelSocket objektumoknak

  4. A ChannelSocket tulajdonosa a adatpuffereknek

Figyelem

  1. A ConnectionManager a társaival való kapcsolatok kezelésére szolgál.

  2. A MultiplexedSockets-ot a TLSSocket-en keresztül adatküldésre, a beérkező csomagok olvasására és a csatornákat kezelésére használják.

  3. A ChannelSockets-ot a kliens használja a másik társsal való interakcióhoz.

Használat

A szzenáriumokat a megfelelő egységes tesztekben (test/unitTest/connectionManager/connectionManager.cpp) leírják.