מנהל החיבור

הקדמה

מנהל החיבור הוא החלק הראשון בתכונות צ’אט קבוצתית. כיתה זו מנהלת חיבורים לשחרים ומציעת למשתמש סוקטים מרובבים למכשירים שהם רוצים להתחבר אליס, למשל, אם אליס רוצה להיות מחוברת לאחד מכשירים של בוב כדי להעביר 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
        }
    });

מאחורי זה, מנהל החיבור יתחבר תחילה למכשיר של בוב באמצעות DHT (דרך ICE) ויצור סוקט TLS. לאחר מכן, הוא יבקש ערוץ, וכאשר ערוץ מוכן, ליידע את אליס באמצעות קול-באק. עבור הקובץ השני, הוא ישתמש בסוקט הראשון ויפתח רק ערוץ חדש (רק צריך 2 פקטים TLS, אז זה מהיר)

צד DHT

זה אותו דבר כמו call, ראה Changes ICE מועמדים, ICE משא ומתן, Encrypt את סוקט השליטה אבל רק ב TCP.

עם זאת, כאשר צד מקבל בקשה חדשה של ICE, הוצאת הקול חזרה המוגדרת על ידי ` nullonICERequest(onICERequestCallback&&& cb);

משא ומתן על ערוץ חדש

ערוץ מוגדר על ידי id (אחדות) ו uri (לא ייחודיות). לדוגמה (1, »git://*«)

כאשר מוכן, מנהל החיבור רואה כי ערוץ 0 קיים. ערוץ זה נקרא ערוץ CONTROL ומשמש לבקש ערוצים חדשים.

הפרוטוקול המשמש הוא די פשוט ונראה כמו פרוטוקול RTP:

  1. 16 ביטים משמשים לאחסון את אורך הגוף.

  2. 16 ביטים עבור ID של הערוץ (יעד)

  3. גוף

כל החבילה יש כותרת ל-LEN של 32 ביטים.

כדי לבקש ערוץ חדש, מנהל החיבור ישלח אובייקט ChannelRequest (msgpack משמש כדי לסדר את struct) בערוץ 0 כדי לשלוח את איד ושם ערוץ החדש לציבור (עם isAnswer = false). השותף יצלם את ההקרא בחזרה שניתן עם ̀ void onChannelRequest(ChannelRequestCallBack&&& cb); ויסרב או יקבל את ההקראה. אם ייקבל, השותף יענה עם ChannelRequest עם אותם נתונים (וא ̀isAnswer = true`) ואז שני השותפים יפעילו קראונים חזרה כדי ליידע כי ChannelSock ניתן לשימוש.

סגירת ערוץ

EOF משודר עבור ערוץ אם אורך התוכן הוא 0.

מבנה החיבור

בעלות

  1. חשבון ג’מי הוא הבעלים של מנהל החיבור ויש לו גישה לאובייקטים של ChannelSocket (shared_ptr בבעלות עם MultiplexedSocket.

  2. מנהל החיבורים מחזיק ב-MultiplexedSockets ו-ICE

  3. MultiplexedSockets היא הבעלים של תחבורה TLS ואת אובייקטים ChannelSocket

  4. ChannelSocket היא הבעלים של המחסנים

תפקידים

  1. ConnectionManager משמש לניהול חיבורים לשנים.

  2. MultiplexedSockets משמשים לשלוח נתונים דרך TLSSocket, לקרוא את הפקטים הפומביים וניהול ערוצים.

  3. ChannelSockets משמשים על ידי הלקוח כדי לתקשר עם השותף האחר.

שימוש

סצנות מתוארות בניסויים של יחידות המתאימים (test/unitTest/connectionManager/connectionManager.cpp)