সংযোগ ব্যবস্থাপক
প্রবর্তন
সংযোগ পরিচালক গ্রুপ চ্যাট বৈশিষ্ট্যগুলির প্রথম অংশ। এই শ্রেণীটি সমকক্ষদের সাথে সংযোগ পরিচালনা করে এবং ব্যবহারকারীকে সংযুক্ত করতে চান এমন ডিভাইসগুলিতে মাল্টিপ্লেক্সড সকেট সরবরাহ করে। উদাহরণস্বরূপ, যদি অ্যালিস 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 Socket সেট আপ করবে। তারপরে, এটি একটি চ্যানেলের জন্য জিজ্ঞাসা করবে এবং যখন চ্যানেলটি প্রস্তুত হবে, কলব্যাকের মাধ্যমে অ্যালিসকে অবহিত করবে। দ্বিতীয় ফাইলের জন্য, এটি প্রথম সকেটটি ব্যবহার করবে এবং কেবল একটি নতুন চ্যানেল খুলবে (শুধুমাত্র 2 টিএলএস প্যাকেট প্রয়োজন, তাই এটি দ্রুত)
DHT পার্শ্ব
এটি call, দেখুন Exchange ICE প্রার্থী, ICE negotiation, Encrypt control socket কিন্তু শুধুমাত্র TCP তে।
তবে, যখন কোনও পক্ষ একটি নতুন আইসিই অনুরোধ পায়, তখন void onICERequest(onICERequestCallback&&& cb); দ্বারা সেট করা কলব্যাকটি সক্রিয় করা হয়।
নতুন চ্যানেল নিয়ে আলোচনা
একটি চ্যানেল একটি আইডি (একক) এবং একটি uri (একক নয়) দ্বারা সংজ্ঞায়িত করা হয়। উদাহরণস্বরূপ (1, 'git://*')
যখন প্রস্তুত হয়, ConnectionManager মনে করে যে 0 চ্যানেলটি বিদ্যমান। এই চ্যানেলটি CONTROL চ্যানেল বলা হয় এবং নতুন চ্যানেলের জন্য জিজ্ঞাসা করতে ব্যবহৃত হয়।
ব্যবহৃত প্রোটোকলটি বেশ সহজ এবং RTP প্রোটোকলের মতো দেখতেঃ
শরীরের দৈর্ঘ্য সংরক্ষণ করতে ১৬ বিট ব্যবহার করা হয়।
চ্যানেল আইডি (গন্তব্য) এর জন্য 16 বিট
শরীর
তাই সব প্যাকেটে ৩২ বিট লেন হেডার থাকে।
নতুন চ্যানেলের জন্য অনুরোধ করার জন্য, সংযোগ ব্যবস্থাপক 0 চ্যানেলের মধ্যে একটি ChannelRequest অবজেক্ট প্রেরণ করবে (msgpack স্ট্রাক্টটি সিরিয়ালাইজ করতে ব্যবহৃত হয়) পিয়ারকে নতুন চ্যানেলের আইডি এবং নাম প্রেরণ করতে ( isAnswer = false) । পিয়ারটি ChannelRequest এ ̀ void দিয়ে দেওয়া কলব্যাকটি কলব্যাক করবে এবং অনুরোধটি প্রত্যাখ্যান করবে বা গ্রহণ করবে। যদি গৃহীত হয় তবে পিয়ার একই ডেটা সহ একটি ChannelRequest দিয়ে উত্তর দেবে (এবং ̀isAnswer = true) এবং তারপরে উভয় পিয়ার কলব্যাক সক্রিয় করা হবে যাতে জানানো যায় যে ChannelSock ব্যবহারযোগ্য।
একটি চ্যানেল বন্ধ করা
একটি EOF একটি চ্যানেলের জন্য প্রেরণ করা হয় যদি এর দৈর্ঘ্য 0 হয়।
সংযোগের কাঠামোManager
মালিকানা
একটি জ্যামি অ্যাকাউন্ট কানেকশন ম্যানেজার মালিক এবং চ্যানেলসকেট অবজেক্টগুলিতে অ্যাক্সেস আছে (মাল্টিপ্লেক্সডসকেট-এর সাথে মালিকানাধীন শেয়ার্ড_পিটিআর।
ConnectionManager এর মালিক MultiplexedSockets এবং ICE অবজেক্ট
MultiplexedSockets TLS পরিবহন এবং ChannelSocket বস্তুর মালিক
ChannelSocket ডেটা বাফার মালিক
ভূমিকা
ConnectionManager ব্যবহার করা হয় সমকক্ষদের সাথে সংযোগ পরিচালনা করতে।
মাল্টিপ্লেক্সডসকেটগুলি টিএলএসএসসকেট জুড়ে ডেটা প্রেরণ, প্রাপ্ত প্যাকেটগুলি পড়া এবং চ্যানেল পরিচালনা করতে ব্যবহৃত হয়।
চ্যানেলসকেট ব্যবহারকারী অন্য সমকক্ষের সাথে যোগাযোগ করতে ব্যবহার করে।
ব্যবহার
সংশ্লিষ্ট ইউনিট টেস্টে (test/unitTest/connectionManager/connectionManager.cpp) চিত্রগুলি বর্ণনা করা হয়েছে।