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 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:

  1. 16 bit được sử dụng để lưu trữ chiều dài của cơ thể.

  2. 16 bit cho ID kênh (các điểm đến)

  3. 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); 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

  1. 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.

  2. ConnectionManager sở hữu MultiplexedSockets và các đối tượng ICE

  3. MultiplexedSockets sở hữu các giao thông TLS và các đối tượng ChannelSocket

  4. ChannelSocket sở hữu các bộ đệm dữ liệu

Vai trò

  1. ConnectionManager được sử dụng để quản lý kết nối với các đồng nghiệp.

  2. 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.

  3. 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)