Người quản lý kết nối
Khởi đầu
Các hệ thống quản lý kết nối là phần đầu tiên của các tính năng trò chuyện nhóm. lớp này quản lý các kết nối với các đồng nghiệp và cung cấp cho người dùng các ổ cắm đa phương cho các thiết bị họ muốn kết nối. Ví dụ, nếu Alice muốn được kết nối với một trong các thiết bị của Bob để chuyển 2 tệp, cô ấy sẽ yêu cầu ConnectionManager mở 2 kênh (một cho mỗi tệp). Điều này sẽ cung cấp:
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
}
});
Sau đó, ConnectionManager sẽ kết nối với thiết bị của Bob thông qua DHT (via ICE) và thiết lập một TLS Socket. Sau đó, nó sẽ yêu cầu một kênh, và khi kênh sẵn sàng, thông báo cho Alice thông qua một callback. Đối với tập tin thứ hai, nó sẽ sử dụng ổ cắm đầu tiên và sẽ mở một kênh mới (chỉ cần 2 gói TLS, vì vậy nó nhanh chóng)
DHT bên
Nó giống như call, xem Chân đổi ICE ứng cử viên, ICE đàm phán, Encrypt socket điều khiển nhưng chỉ trong TCP.
Tuy nhiên, khi một bên nhận được yêu cầu ICE mới, cuộc gọi trở lại được thiết lập bởi vô hiệu onICERequest(onICERequestCallback&&& cb);
được kích hoạt.
Tham đàm một kênh mới
Một kênh được định nghĩa bởi một id (đặc biệt) và một uri (không độc đáo). Ví dụ (1, 'git://*')
Khi sẵn sàng, ConnectionManager xem xét rằng kênh 0 hiện hữu.
Các giao thức được sử dụng khá đơn giản và trông giống như giao thức RTP:
16 bit được sử dụng để lưu trữ chiều dài của cơ thể.
16 bit cho ID kênh (các điểm đến)
cơ thể
Tất cả các gói đều có len header 32 bit.
Để yêu cầu một kênh mới, ConnectionManager sẽ gửi một đối tượng ChannelRequest
(msgpack được sử dụng để xoay trình cấu trúc) trong kênh 0 để gửi id và tên của kênh mới cho người ngang hàng (với isAnswer = false
). Người ngang hàng sẽ gọi lại cuộc gọi được đưa ra với ̀ void trênChannelRequest(ChannelRequestCallBack&&& cb); và sẽ từ chối hoặc chấp nhận yêu cầu. Nếu được chấp nhận, người ngang hàng sẽ trả lời bằng một ChannelRequest với cùng dữ liệu (và ̀
isAnswer = true`) và sau đó cả hai người ngang hàng sẽ được kích hoạt để thông báo rằng ChannelSock có thể sử dụng.
Đóng một kênh
Một EOF được truyền cho một kênh nếu chiều dài của nội dung là 0.
Cấu trúc kết nốiManager
Chủ sở hữu
Một JamiAccount sở hữu ConnectionManager và có quyền truy cập vào các đối tượng ChannelSocket (shared_ptr thuộc sở hữu của MultiplexedSocket.
ConnectionManager sở hữu MultiplexedSockets và các đối tượng ICE
MultiplexedSockets sở hữu các giao thông TLS và các đối tượng ChannelSocket
ChannelSocket sở hữu các bộ đệm dữ liệu
Vai trò
ConnectionManager được sử dụng để quản lý kết nối với các đồng nghiệp.
MultiplexedSockets được sử dụng để gửi dữ liệu qua TLSSocket, đọc các gói tin nhập và quản lý kênh.
ChannelSockets được sử dụng bởi khách hàng để tương tác với người đồng nghiệp khác.
Sử dụng
Các kịch bản được mô tả trong các thử nghiệm đơn vị tương ứng (test/unitTest/connectionManager/connectionManager.cpp
)