कनेक्शन प्रबंधक
परिचय
कनेक्शन मैनेजर ग्रुप चैट सुविधाओं का पहला टुकड़ा है। यह वर्ग सहकर्मियों के लिए कनेक्शन प्रबंधित करता है और उपयोगकर्ता को उन उपकरणों के लिए मल्टीप्लेक्स्ड सॉकेट प्रदान करता है जिन्हें वे कनेक्ट करना चाहते हैं। उदाहरण के लिए, यदि एलिस 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 के माध्यम से बॉब के डिवाइस से कनेक्ट होगा (आईसीई के माध्यम से) और एक TLS सॉकेट सेट अप करेगा। फिर, यह एक चैनल के लिए पूछता है, और जब चैनल तैयार हो जाएगा, तो कॉलबैक के माध्यम से एलिस को सूचित करें। दूसरी फ़ाइल के लिए, यह पहले सॉकेट का उपयोग करेगा और बस एक नया चैनल खोल देगा (केवल 2 TLS पैकेट की आवश्यकता है, इसलिए यह तेज है)
डीएचटी पक्ष
यह call के समान है, Exchange ICE उम्मीदवारों, ICE बातचीत, Encrypt नियंत्रण सॉकेट लेकिन केवल TCP में।
हालांकि, जब किसी पक्ष को एक नया आईसीई अनुरोध प्राप्त होता है, तो शून्य onICERequest(onICERequestCallback&&& cb);
द्वारा निर्धारित कॉलबैक ट्रिगर किया जाता है।
एक नए चैनल पर बातचीत
एक चैनल को एक id (अद्वितीय) और एक uri (अद्वितीय नहीं) द्वारा परिभाषित किया जाता है। उदाहरण के लिए (1, 'git://*')
जब तैयार हो जाता है, तो कनेक्शन मैनेजर मानता है कि चैनल 0 मौजूद है। इस चैनल को CONTROL चैनल कहा जाता है और इसका उपयोग नए चैनलों के लिए पूछने के लिए किया जाता है।
प्रयोक्ता प्रोटोकॉल काफी सरल है और RTP प्रोटोकॉल की तरह दिखता हैः
शरीर की लंबाई को संग्रहीत करने के लिए 16 बिट्स का उपयोग किया जाता है।
चैनल आईडी (गंतव्य) के लिए 16 बिट्स
शरीर
तो सभी पैकेट में एक 32 बिट लेन हेडर है।
एक नए चैनल के लिए पूछने के लिए, कनेक्शन मैनेजर चैनल 0 में एक ChannelRequest
ऑब्जेक्ट (msgpack का उपयोग स्ट्रक्चर को क्रमबद्ध करने के लिए किया जाता है) भेज देगा ताकि नए चैनल की पहचान और नाम को सहकर्मी को भेज दिया जा सके (के साथ isAnswer = false
) । सहकर्मी चैनलRequest पर ̀ void के साथ दिए गए कॉलबैक को कॉल करेगा(ChannelRequestCallBack&& cb); और अनुरोध को अस्वीकार या स्वीकार करेगा। यदि स्वीकार किया गया है, तो सहकर्मी एक ही डेटा के साथ एक चैनलRequest के साथ जवाब देगा (और ̀
isAnswer = true`) और फिर दोनों सहकर्मी कॉलबैक को चालू किया जाएगा ताकि सूचित किया जा सके कि चैनलसॉक उपयोग योग्य है।
एक चैनल को बंद करना
एक EOF चैनल के लिए प्रेषित किया जाता है यदि सामग्री की लंबाई 0 है।
कनेक्शन संरचना प्रबंधक
स्वामित्व
एक JamiAccount ConnectionManager का मालिक है और ChannelSocket ऑब्जेक्ट्स (shared_ptr MultiplexedSocket के स्वामित्व में है) तक पहुंच है।
कनेक्शन मैनेजर के पास मल्टीप्लेक्स्ड सॉकेट और आईसीई ऑब्जेक्ट हैं
MultiplexedSockets TLS परिवहन और ChannelSocket वस्तुओं का मालिक है
चैनलसॉकेट डेटा बफर का मालिक है
भूमिकाएँ
ConnectionManager का उपयोग सहकर्मियों के साथ कनेक्शन प्रबंधित करने के लिए किया जाता है।
मल्टीप्लेक्स्ड सॉकेट का उपयोग TLSSocket पर डेटा भेजने, आने वाले पैकेट पढ़ने और चैनलों का प्रबंधन करने के लिए किया जाता है।
चैनलसॉकेट का उपयोग ग्राहक द्वारा दूसरे सहकर्मी के साथ बातचीत करने के लिए किया जाता है।
उपयोग
परिदृश्यों को संबंधित इकाई परीक्षणों में वर्णित किया गया है (test/unitTest/connectionManager/connectionManager.cpp
)