연결 관리자
소개
연결 관리자는 그룹 채팅 기능의 첫 번째 부분입니다. 이 클래스는 동료와의 연결을 관리하고 사용자가 연결하려는 장치에 멀티플렉스 소켓을 제공합니다. 예를 들어, 앨리스가 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 소켓을 설정합니다. 그 다음, 채널을 요청하고, 채널이 준비되면, 콜백을 통해 앨리스에게 알립니다. 두 번째 파일에서는 첫 번째 소켓을 사용하여 새로운 채널을 열 것입니다. (TLS 패키지 2개만 필요하므로 빠르다)
DHT 측면
call와 동일합니다, **ICE 후보를 교환 **, ICE 협상, ** 컨트롤 소켓을 암호화 ** 하지만 TCP에서만.
그러나 당사자가 새로운 ICE 요청을 받으면 onICERequest onICERequestCallback&&& cb);
로 설정된 반발 호출이 발생한다.
새로운 채널을 협상하고 있습니다.
채널은 id (유니크) 와 uri (유니크) 로 정의된다. 예를 들어 (1, ‘git://*’)
준비되면, 연결 관리자는 채널 0이 존재한다고 간주합니다. 이 채널은 CONTROL 채널이라고 불립니다. 그리고 새로운 채널을 요청하는 데 사용됩니다.
사용된 프로토콜은 매우 간단하고 RTP 프로토콜과 비슷합니다.
16 비트로 몸의 길이를 저장합니다.
채널 ID (가장) 에 16 비트
몸
모든 패키지는 32비트 len 헤더를 가지고 있습니다.
새로운 채널을 요청하기 위해, 연결 관리자는 0 채널에 ChannelRequest
객체를 보내 (msgpack을 사용하여 구조를 연속화) 새로운 채널의 아이디와 이름을 동료에게 보내 (→isAnswer = false`) ⇒ ‧ChannelRequest on ̀ void (→ChannelRequest) 에 주어진 호출을 호출합니다.
채널을 닫는 것
채널의 길이가 0이면 EOF가 전송된다.
연결 구조 관리자
소유권
JamiAccount는 ConnectionManager를 소유하고 있으며, ChannelSocket 객체 (shared_ptr) 에 액세스 할 수 있습니다.
커넥션 매니저는 멀티플렉스드소켓 및 ICE 객체를 소유하고 있습니다.
멀티플렉스소켓은 TLS 트랜스포트 및 채널소켓 객체를 소유하고 있습니다
채널소켓은 데이터 버퍼를 소유하고 있습니다
역할
ConnectionManager는 동료와의 연결을 관리하는 데 사용됩니다.
멀티플렉스소켓은 TLSSocket을 통해 데이터를 전송하고, 수신 패킷을 읽고 채널을 관리하는 데 사용됩니다.
채널소켓은 클라이언트가 다른 동료와 상호 작용하기 위해 사용합니다.
사용
각 시나리오는 해당 단위 테스트 (test/unitTest/connectionManager/connectionManager.cpp
) 에서 설명된다.