Управляващият връзка
Введение
Управляващият връзка е първият елемент от функциите на групния чат. Този клас управлява връзките с връстници и предлага на потребителя мултиплексирани сокети на устройства, които искат да свържат. Например, ако Алис иска да бъде свързана с едно от устройствата на Боб, за да прехвърли 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:
- 16 бита се използват за съхранение на дължината на тялото. 
- 16 бита за идентификационния канал (назначение) 
- органи 
Всички пакети имат 32-битно заглавие.
За да поиска нов канал, ConnectionManager ще изпрати ChannelRequest обект (msgpack се използва за сериализиране на структурата) в канал 0 за изпращане на идентификатора и името на новия канал на връстника (с isAnswer = false).
Затваряне на канал
Ако съдържанието е по-дълго от 0, се предава EOF за канал.
Структура на връзката
Притежание
- JamiAccount притежава ConnectionManager и има достъп до ChannelSocket обектите (shared_ptr притежава с MultiplexedSocket. 
- ConnectionManager притежава множествени Sockets и ICE обекти 
- MultiplexedSockets притежава транспорта на TLS и обектите ChannelSocket 
- ChannelSocket притежава буферните данни 
Роли
- ConnectionManager се използва за управление на връзките с връстници. 
- MultiplexedSockets се използват за изпращане на данни по TLSSocket, четене на входящите пакети и управление на каналите. 
- ChannelSockets се използват от клиента за взаимодействие с другия връстник. 
Използване
Сценарии са описани в съответните тестове на единица (test/unitTest/connectionManager/connectionManager.cpp)