Управляващият връзка

Введение

Управляващият връзка е първият елемент от функциите на групния чат. Този клас управлява връзките с връстници и предлага на потребителя мултиплексирани сокети на устройства, които искат да свържат. Например, ако Алис иска да бъде свързана с едно от устройствата на Боб, за да прехвърли 2 файла, тя ще поиска от Управляващия връзка да отвори 2 канали (един за файл) за Боб. Това ще даде:

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

След това ConnectionManager ще се свърже с устройството на Боб чрез DHT (през ICE) и ще създаде TLS Socket. След това ще поиска канал, а когато каналът е готов, информира Алис чрез обратна връзка. За втория файл, той ще използва първия сокет и ще отвори нов канал (пожелава само 2 TLS пакета, така че е бързо)

ДHT странична

Това е същото като call, виж Exchange ICE кандидатите, ICE преговори, Encrypt контролната сокет, но само в TCP.

Когато обаче една страна получи нов запитване от ICE, се активира обратното обаждане, определено с null onICERequest(onICERequestCallback&&& cb);.

Преговаряме за нов канал

Каналът се определя от id (уникален) и uri (не уникален).

Когато е готов, ConnectionManager счита, че канал 0 съществува. Този канал се нарича канал CONTROL и се използва за търсене на нови канали.

Протоколът е доста прост и прилича на протокола RTP:

  1. 16 бита се използват за съхранение на дължината на тялото.

  2. 16 бита за идентификационния канал (назначение)

  3. органи

Всички пакети имат 32-битно заглавие.

За да поиска нов канал, ConnectionManager ще изпрати ChannelRequest обект (msgpack се използва за сериализиране на структурата) в канал 0 за изпращане на идентификатора и името на новия канал на връстника (с isAnswer = false).

Затваряне на канал

Ако съдържанието е по-дълго от 0, се предава EOF за канал.

Структура на връзката

Притежание

  1. JamiAccount притежава ConnectionManager и има достъп до ChannelSocket обектите (shared_ptr притежава с MultiplexedSocket.

  2. ConnectionManager притежава множествени Sockets и ICE обекти

  3. MultiplexedSockets притежава транспорта на TLS и обектите ChannelSocket

  4. ChannelSocket притежава буферните данни

Роли

  1. ConnectionManager се използва за управление на връзките с връстници.

  2. MultiplexedSockets се използват за изпращане на данни по TLSSocket, четене на входящите пакети и управление на каналите.

  3. ChannelSockets се използват от клиента за взаимодействие с другия връстник.

Използване

Сценарии са описани в съответните тестове на единица (test/unitTest/connectionManager/connectionManager.cpp)