जडान प्रबन्धक
परिचय
जडान प्रबन्धक समूह च्याट सुविधाहरूको पहिलो टुक्रा हो। यो वर्गले साथीहरूसँग जडानहरू प्रबन्ध गर्दछ र प्रयोगकर्तालाई उनीहरूले जडान गर्न चाहने उपकरणहरूमा मल्टिप्लेक्स्ड सोकेटहरू प्रस्ताव गर्दछ। उदाहरणका लागि, यदि एलिसले २ फाइलहरू हस्तान्तरण गर्न बोबको उपकरणमा जडान गर्न चाहन्छ भने, उनले जडान प्रबन्धकलाई २ च्यानलहरू खोल्न अनुरोध गर्नेछन् (एक प्रति फाइल) बोबलाई। यसले दिनेछः
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 Socket सेटअप गर्दछ। त्यसपछि, यसले च्यानलको लागि सोध्छ, र जब च्यानल तयार हुन्छ, कलब्याक मार्फत एलिसलाई सूचित गर्नुहोस्। दोस्रो फाइलको लागि, यसले पहिलो सकेट प्रयोग गर्दछ र नयाँ च्यानल खोल्छ (केवल २ TLS प्याकेट चाहिन्छ, त्यसैले यो छिटो छ)
DHT पक्ष
यो call जस्तै हो, **Exchange ICE उम्मेदवारहरू **, ICE वार्ता, Encrypt नियन्त्रण सोकेट तर मात्र TCP मा।
तर, जब कुनै पक्षले नयाँ आईसीई अनुरोध प्राप्त गर्दछ, शून्य onICERequest(onICERequestCallback&&& cb);
द्वारा सेट गरिएको कलब्याक ट्रिगर हुन्छ।
नयाँ च्यानलको बारेमा वार्ता गर्दै
एक च्यानल एक id (अद्वितीय) र एक uri (अद्वितीय छैन) द्वारा परिभाषित गरिएको छ। उदाहरणका लागि (1, 'git://*')
जब तयार हुन्छ, कनेक्शनम्यानेजरले च्यानल ० को अस्तित्व रहेको ठान्छ। यो च्यानललाई CONTROL च्यानल भनिन्छ र नयाँ च्यानलहरूको लागि सोध्न प्रयोग गरिन्छ।
प्रयोग गरिएको प्रोटोकल एकदम सरल छ र RTP प्रोटोकल जस्तै देखिन्छः
शरीरको लम्बाइ भण्डारण गर्न १६ बिट प्रयोग गरिन्छ।
च्यानल आईडी (गन्तव्य) को लागि १६ बिट
शरीर
सबै प्याकेटमा ३२ बिट लेन हेडर हुन्छ ।
नयाँ च्यानलको लागि अनुरोध गर्न, कनेक्शनम्यानेजरले च्यानल ० मा एक ChannelRequest
वस्तु पठाउनेछ (msgpack स्ट्रक्चरलाई सिरियल गर्न प्रयोग गरिन्छ) नयाँ च्यानलको आईडी र नाम साथीलाई पठाउन (र isAnswer = false
) । साथीले ̀ void onChannelRequestमा दिइएको कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याक कलब्याकक कलब्याक कलब्याककक कलब्याककककककककककककककककककककककककककककककक
एक च्यानल बन्द गर्दै
एक EOF प्रसारण गरिन्छ यदि सामग्रीको लम्बाइ ० हो भने।
जडान संरचनाप्रबन्धक
स्वामित्व
एक JamiAccount को स्वामित्वमा छ ConnectionManager र पहुँच छ ChannelSocket वस्तुहरू (साझेदारी_ptr स्वामित्वमा छ MultiplexedSocket.
कनेक्सनमेनेजरको स्वामित्वमा MultiplexedSockets र ICE वस्तुहरू छन्
MultiplexedSockets ले TLS यातायात र ChannelSocket वस्तुहरूको स्वामित्व राख्दछ
ChannelSocket ले डाटा बफरको स्वामित्वमा छ
भूमिका
ConnectionManager सहकर्मीहरूसँगको जडानहरू व्यवस्थापन गर्न प्रयोग गरिन्छ।
मल्टीप्लेक्स्डसकेटहरू TLSSocket मार्फत डाटा पठाउन, आगमन प्याकेटहरू पढ्न र च्यानलहरू व्यवस्थापन गर्न प्रयोग गरिन्छ।
ग्राहकले अन्य सहकर्मीसँग अन्तरक्रिया गर्न ChannelSockets प्रयोग गर्दछ।
प्रयोग
सम्बन्धित इकाई परीक्षणहरूमा परिदृश्यहरू वर्णन गरिएको छ (test/unitTest/connectionManager/connectionManager.cpp
)