مدیر اتصال

مقدمه

مدیر اتصال اولین بخش از ویژگی های چت گروه است. این کلاس ارتباطات را با همسالان مدیریت می کند و به کاربر سوکت های چندگانه ای را به دستگاه هایی که می خواهند متصل شوند ارائه می دهد. به عنوان مثال، اگر آلیس می خواهد به یکی از دستگاه های باب برای انتقال 2 فایل متصل شود، او از مدیر اتصال خواهد گفت که 2 کانال (یک در هر فایل) را به باب باز کند. این به Bob می دهد:

    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 را تنظیم می کند. سپس، از یک کانال می خواهد و هنگامی که کانال آماده است، به آلیس از طریق یک تماس باز اطلاع می دهد. برای فایل دوم، از سوکت اول استفاده می کند و فقط یک کانال جدید را باز می کند (تنها به 2 بسته TLS نیاز دارد، بنابراین سریع است)

طرف DHT

این همان چیزی است که call، Changes ICE candidates، ICE negotiation، Encrypt the control socket، اما فقط در TCP.

با این حال، وقتی یک طرف درخواست جدید ICE دریافت کند، کال بیک که توسط ` null onICERequest(onICERequestCallback&&& cb);

مذاکره درباره کانال جدید

یک کانال توسط یک id (وحد) و یک uri (غیر منحصر به فرد) تعریف می شود. به عنوان مثال (1, 'git://*')

هنگامی که آماده است، کنکشنمنجر می داند که کانال 0 وجود دارد. این کانال به نام کانال CONTROL نامیده می شود و برای درخواست کانال های جدید استفاده می شود.

پروتکل استفاده شده خیلی ساده است و شبیه پروتکل RTP است:

  1. 16 بیت برای ذخیره طول بدن استفاده می شود.

  2. 16 بیت برای ID کانال (مقصود)

  3. بدن

پس همه بسته ها دارای یک 32 بیت len header هستند.

برای درخواست یک کانال جدید، ConnectionManager یک ChannelRequest آبجیک (msgpack برای سریال سازی ساختار استفاده می شود) را در کانال 0 ارسال می کند تا ID و نام کانال جدید را به همتا ارسال کند (با isAnswer = false). همتا تماس مجدد را با ̀ void در ChannelRequest(ChannelRequestCallBack&&& cb) فرا می خواند و درخواست را رد یا پذیرفته است. اگر پذیرفته شود، همتا با یک ChannelRequest با داده های مشابه پاسخ می دهد (و ̀isAnswer = true) و سپس هر دو همتا تماس مجدد فعال می شود تا اطلاع دهد که ChannelSock قابل استفاده است.

بسته شدن کانال

یک EOF برای یک کانال ارسال می شود اگر طول محتوای آن 0 باشد.

ساختار اتصال مدیر

مالکیت

  1. یک حساب Jami دارای ConnectionManager است و به اشیاء ChannelSocket (shared_ptr متعلق به MultiplexedSocket) دسترسی دارد.

  2. ConnectionManager مالک MultiplexedSockets و اشیاء ICE است

  3. MultiplexedSockets مالک انتقال TLS و اشیاء ChannelSocket است

  4. ChannelSocket صاحب بازنده های داده ها است

نقش ها

  1. ConnectionManager برای مدیریت ارتباطات با همسالان استفاده می شود.

  2. MultiplexedSockets برای ارسال داده ها از طریق TLSSocket، خواندن بسته های وارد شده و مدیریت کانال ها استفاده می شود.

  3. کانال سوکت ها توسط مشتری برای تعامل با همسال دیگر استفاده می شوند.

استفاده

سناریوهای در آزمون های واحد مربوطه (test/unitTest/connectionManager/connectionManager.cpp) توصیف شده است.