Управляващият връзка
Введение
Управляващият връзка е първият елемент от функциите на групния чат. Този клас управлява връзките с връстници и предлага на потребителя мултиплексирани сокети на устройства, които искат да свържат. Например, ако Алис иска да бъде свързана с едно от устройствата на Боб, за да прехвърли 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
)