Управляющий связи
Введение
Управляющий соединения - это первый элемент группового чата. Этот класс управляет соединениями с одноклассниками и предлагает пользователю мультиплексованные сокеты к устройствам, которые они хотят соединить. Например, если Алиса хочет быть подключена к одному из устройств Боба для передачи 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 candidates, ICE negotiation, Encrypt the control socket, но только в TCP.
Однако, когда сторона получает новое запрос ICE, возвратный звонок, установленный null onICERequest(onICERequestCallback&&& cb);
, запускается.
Переговоры о новом канале
Канал определяется идентификатором (уникальный) и ури (не уникальный).
Когда он готов, ConnectionManager считает, что канал 0 существует. Этот канал называется каналом CONTROL и используется для запроса новых каналов.
Используемый протокол довольно прост и похож на протокол RTP:
16 бит используются для хранения длины тела.
16 бит для идентификатора канала (направления)
тело
Так что все пакеты имеют 32-битный len header.
Для запроса нового канала ConnectionManager отправит объект ChannelRequest
(msgpack используется для сериализации структуры) в канале 0 для отправки идентификатора и имени нового канала к коллеге (с isAnswer = false
).
Закрытие канала
EOF передается для канала, если длина содержания составляет 0.
Структура соединенияУправляющий
Собственность
У аккаунта Jami есть ConnectionManager и доступ к объектам ChannelSocket (shared_ptr, принадлежащий MultiplexedSocket).
ConnectionManager владеет объектами MultiplexedSockets и ICE
MultiplexedSockets владеет транспортом TLS и объектами ChannelSocket
ChannelSocket владеет буферами данных
Роли
ConnectionManager используется для управления связями с одноклассниками.
MultiplexedSockets используются для отправки данных через TLSSocket, чтения входящих пакетов и управления каналами.
ChannelSockets используются клиентом для взаимодействия с другими партнерами.
Использование
Сценарии описаны в соответствующих единичных тестах (test/unitTest/connectionManager/connectionManager.cpp
)