مدير الاتصال
مقدمة
مدير الاتصال هو الجزء الأول من ميزات الدردشة الجماعية. هذه الفئة تدير الاتصالات إلى الأقران وتقدم للمستخدم مقاطع متعددة إلى الأجهزة التي يرغب في الاتصال بها. على سبيل المثال، إذا أرادت أليس أن تكون متصلة بأحد أجهزة بوب لنقل ملفات 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
}
});
وراء ذلك، سيتم توصيل ConnectionManager أولاً إلى جهاز بوب عبر DHT (via ICE) وإعداد Socket TLS. ثم، سوف يطلب قناة، وعندما يكون القناة جاهزة، إعلام أليس عن طريق استدعاء. للملف الثاني، سوف تستخدم القناة الأولى وسوف تفتح قناة جديدة (يحتاج فقط 2 حزم TLS، لذلك هو سريع)
الجانب DHT
إنه نفس call، انظر ** تبادل مرشحين ICE**، ** مفاوضات ICE**، ** تشفير محطة التحكم** ولكن فقط في TCP.
ومع ذلك، عندما يتلقى طرف طلب جديد من ICE، يتم تشغيله للردود المطلوب من قبل null onICERequest(onICERequestCallback&&& cb);
.
التفاوض على قناة جديدة
يتم تعريف القناة بواسطة id (وحيد) و uri (غير فريد). على سبيل المثال (1, 'git://*')
عندما يكون جاهزاً، يعتقد مدير الاتصال أن القناة 0 موجودة. هذه القناة تسمى قناة CONTROL و تستخدم لطلب القنوات الجديدة.
البروتوكول المستخدم بسيط جدا ويبدو مثل بروتوكول RTP:
تستخدم 16 بت لتخزين طول الجسم.
16 بت لـ (المقصود)
الجسم
كل الحزم لديها رأس لين 32 بت
لطلب قناة جديدة، سوف يرسل مدير الاتصال (msgpack) اعتراض ChannelRequest
(يتم استخدامه لترتيب struct) في القناة 0 لإرسال الهوية واسم القناة الجديدة إلى الزميل (مع isAnswer = false
). سيتم تنشيط الزميل للرد فعلًا مع ̀ void علىChannelRequest(ChannelRequestCallBack&&& cb); وسوف يرفض أو يقبل الطلب. إذا تم قبوله، سوف يرد الزميل مع ChannelRequest مع نفس البيانات (و ̀
isAnswer = true`) ثم سيتم تشغيل رد فعل الزميلين لإعلامهم بأن ChannelSock قابلة للاستخدام.
إغلاق قناة
يتم إرسال EOF لقناة إذا كان طول المحتوى 0.
هيكل الاتصال
الملكية
يمتلك حساب جامي ConnectionManager ويحصل على كائنات ChannelSocket (shared_ptr المملوكة مع MultiplexedSocket.
يمتلك ConnectionManager كائنات MultiplexedSockets و ICE
MultiplexedSockets يمتلك نقل TLS و ChannelSocket الأشياء
ChannelSocket يمتلك مخازن البيانات
الأدوار
يستخدم ConnectionManager لإدارة الاتصالات مع الأقران.
تستخدم MultiplexedSockets لإرسال البيانات عبر TLSSocket وقراءة الحزم الموصلة وإدارة القنوات.
يتم استخدام ChannelSockets من قبل العميل للتفاعل مع الزملاء الآخرين.
الاستخدام
يتم وصف السيناريوهات في اختبارات الوحدة المقابلة (test/unitTest/connectionManager/connectionManager.cpp
)