接続管理者
紹介
接続マネージャーはグループチャット機能の第一部分です.このクラスでは,同類との接続を管理し,ユーザーが接続したいデバイスにマルチスイッチを提示します.例えば,アリスがボブのデバイスに接続され,2つのファイルを転送したい場合は,接続マネージャーはボブに2つのチャンネル (ファイルごとに1つ) を開くように要求します.これは:
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 パケット2つしか必要ありません,だから速くなります)
DHT側
通信は,ICEの候補者交換,ICEの交渉,制御ソケットを暗号化する,しかしTCPでのみ.
しかし,一方が新しいICE要求を受け取ると, 無効 onICERequest(onICERequestCallback&&& cb);
によって設定された呼び戻しは起動されます.
新しいチャンネルを交渉する
チャンネルは id (ユニーク) と uri (ユニークではない) によって定義される.例えば (1, 'git://*')
接続管理者は,準備ができると,チャンネル0が存在すると考えます.このチャンネルは, CONTROLチャンネルと呼ばれ,新しいチャンネルを要求するために使用されます.
簡単なプロトコルで RTPプロトコルのように見えます
16 ビットで体の長さを保存します
チャンネルID (目的地) に 16 ビット
身体
32ビットレインヘッダがあります.
新しいチャンネルを要求するには,ConnectionManagerは,チャンネル0に ChannelRequest
オブジェクトを送信する (msgpack を使用して構造をシリアライズする) により,新しいチャンネルの id と名前をピアに送信する (と isAnswer = false
).ピアはChannelRequestに ̀ voidで与えられたコールバックを呼び出す ([[ChannelRequestCallBack&&& cb]]);,そして拒否または要求を受け入れる.受け入れられた場合,ピアは同じデータで ChannelRequest で応答する (および ̀
isAnswer = true`) そして,両ピアのコールバックが起動され,ChannelSock が使用可能であることを通知します.
チャンネルを閉じる
チャンネルの長さは 0 で,EOF* が送信されます.
接続構造 マネージャー
所有権
ジュミアカウントは ConnectionManager を所有し,ChannelSocket オブジェクト (MultiplexedSocket に所有する shared_ptr) にアクセスできます.
ConnectionManagerはMultiplexedSocketsとICEオブジェクトを所有している
MultiplexedSockets は TLS 輸送と ChannelSocket オブジェクトを所有している
ChannelSocketはデータバッファを所有している
役割
ConnectionManagerは,同級者との接続を管理するために使用されます.
マルチプレックスソケットはTLSSocketでデータを送信し,受信パケットを読み,チャンネルを管理するために使用されます.
チャンネルソケットはクライアントが他のピアとやり取りするために使用します.
使用
対応するユニットテスト (test/unitTest/connectionManager/connectionManager.cpp
) でシナリオが記述されています.