Bağlantı yöneticisi

Giriş

Bağlantı yöneticisi grup sohbet özelliklerinin ilk parçasıdır. Bu sınıf, eşcinslerine bağlantıları yönetir ve kullanıcıya bağlamak istediği cihazlara çoklu soketler sunar. Örneğin, Alice, 2 dosya aktarmak için Bob’un cihazlarından birine bağlanmak istiyorsa, Bağlantı yöneticisinden Bob’a 2 kanal (bir dosya başına) açmasını isteyecektir.

    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
        }
    });

Ardından, ConnectionManager önce Bob’un cihazına DHT üzerinden (ICE üzerinden) bağlanır ve bir TLS Socket ayarlar. Sonra, bir kanal isteyecektir ve kanal hazır olduğunda, Alice’i geri çağrı yoluyla bilgilendirecektir. İkinci dosya için, ilk soket kullanır ve yeni bir kanal açır (sadece 2 TLS paketi gerektirir, bu yüzden hızlıdır)

DHT tarafı

call, Exchange ICE adayları, ICE müzakere, Enkripte kontrol soketi ama sadece TCP.

Ancak, bir taraf yeni bir ICE talebi alırsa, null onICERequest(onICERequestCallback&&& cb); tarafından belirlenen geri çağrı tetiklenir.

Yeni bir kanal için pazarlık yapıyoruz.

Bir kanal bir id (eşitsiz) ve bir uri (eşitsiz) ile tanımlanır. Örneğin (1, ‘git://*’)

Bağlantı Yöneticisi hazır olduğunda, kanal 0’un var olduğunu düşünüyor. Bu kanal CONTROL kanalı olarak adlandırılır ve yeni kanallar için istemek için kullanılır.

Kullanılan protokol oldukça basit ve RTP protokolüne benziyor:

  1. 16 bit vücudu saklamak için kullanılır.

  2. Kanal kimliği (mavcut) için 16 bit

  3. vücut

Yani tüm paketlerde 32 bit len başlığı var.

Yeni bir kanal istemek için, Bağlantı Yöneticisi, ChannelRequest nesnesini (msgpack’i struct’u serileştirmek için kullanılır) 0 kanalındaki yeni kanalı id ve adını eşyayacıya gönderir ( isAnswer = false). Eşyacı, ChannelRequest’de ̀ void ile verilen çağrıyı çağıracak(ChannelRequestCallBack&&& cb); ve istekleri reddedecek veya kabul edecektir. Kabul edilirse, eşyacı aynı verilerle ChannelRequest ile cevap verecektir (ve ̀isAnswer = true`) ve ardından her iki eşyacı da ChannelSock’un kullanılabilir olduğunu bildirmek için çağrı geri çağrıları tetiklenecektir.

Bir kanal kapatılıyor

Bir kanal için EOF iletilmektedir, eğer içeriğin uzunluğu 0’dur.

Bağlantı yapısıYöneticisi

Sahiplik

  1. Bir JamiHesaba ConnectionManager’a sahip ve ChannelSocket nesneleri (MultiplexedSocket’a ait paylaşım_ptr) erişime sahiptir.

  2. ConnectionManager MultiplexedSockets ve ICE nesneleri sahip

  3. MultiplexedSockets TLS taşımacılığına ve ChannelSocket nesnelere sahip

  4. ChannelSocket, veri tamponlarına sahip.

Roller

  1. ConnectionManager, akranlara bağlantıları yönetmek için kullanılır.

  2. MultiplexedSockets, TLSSocket üzerinden veriler göndermek, gelen paketleri okumak ve kanalları yönetmek için kullanılır.

  3. ChannelSockets, diğer eşleri ile etkileşim kurmak için müşteri tarafından kullanılır.

Kullanım

Scenariler ilgili birim testlerinde açıklanmıştır (test/unitTest/connectionManager/connectionManager.cpp)