కనెక్షన్ మేనేజర్

పరిచయం

కనెక్షన్ మేనేజర్ అనేది గ్రూప్ చాట్ ఫీచర్లలో మొదటి భాగం. ఈ తరగతి సహచరులకు కనెక్షన్లను నిర్వహిస్తుంది మరియు వినియోగదారుడు కనెక్ట్ చేయాలనుకుంటున్న పరికరాలకు బహుళ సోకెట్లు అందిస్తుంది. ఉదాహరణకు, 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 వైపు

ఇది కాల్స్, చూడండి ** ఎక్స్ఛేంజ్ ICE అభ్యర్థులు**, ** ICE చర్చలు**, ** ఎన్క్రిప్ట్ నియంత్రణ సాకెట్** కానీ మాత్రమే TCP లో.

అయితే, ఒక పార్టీకి కొత్త ఐసిఇ అభ్యర్థన వచ్చినప్పుడు, వాడి onICERequest onICERequestCallback&&& cb); ద్వారా అమర్చిన కాల్బ్యాక్ ప్రారంభమవుతుంది.

కొత్త ఛానల్ కోసం చర్చలు

ఒక ఛానెల్ను id (అంతర్జాతీయ) మరియు uri (అంతర్జాతీయం కాదు) నిర్వచించబడుతుంది. ఉదాహరణకు (1, 'git://*')

కనెక్షన్ మేనేజర్ సిద్ధంగా ఉన్నప్పుడు, ఛానల్ 0 ఉందని భావిస్తుంది. ఈ ఛానల్ను CONTROL ఛానల్ అని పిలుస్తారు మరియు కొత్త ఛానెళ్లను అడగడానికి ఉపయోగిస్తారు.

ఉపయోగించిన ప్రోటోకాల్ చాలా సులభం మరియు RTP ప్రోటోకాల్ లాగా కనిపిస్తుందిః

  1. శరీర పొడవును నిల్వ చేయడానికి 16 బిట్లను ఉపయోగిస్తారు.

  2. ఛానల్ ఐడి (గమ్యం) కోసం 16 బిట్స్

  3. శరీరము

కాబట్టి అన్ని ప్యాకేజీలు 32 బిట్ లెన్ హెడ్ కలిగి.

కొత్త ఛానెల్ కోసం అడగడానికి, కనెక్షన్ మేనేజర్ ఛానెల్ 0 లో ChannelRequest వస్తువును (msgpack ను struct ను క్రమబద్ధీకరించడానికి ఉపయోగిస్తారు) పంపి కొత్త ఛానెల్ యొక్క ID మరియు పేరును పీర్కు పంపిస్తుంది ( isAnswer = false). పీర్ ఛానెల్Request లో ̀ void తో ఇచ్చిన కాల్బ్యాక్ను కాల్బ్యాక్ చేస్తుంది(ChannelRequestCallBack&& cb); మరియు అభ్యర్థనను తిరస్కరించే లేదా అంగీకరించేలా చేస్తుంది. అంగీకరించినట్లయితే, పీర్ అదే డేటాతో ఒక ChannelRequest తో సమాధానం ఇస్తుంది (మరియు ̀isAnswer = true`) మరియు అప్పుడు రెండు పీర్ కాల్బ్యాక్లు ChannelSock ఉపయోగకరంగా ఉందని తెలియజేయడానికి ప్రారంభించబడతాయి.

ఒక ఛానెల్ మూసివేయడం

ఒక ఛానల్ కోసం EOF ఒక కంటెంట్ యొక్క పొడవు 0 ఉంటే ప్రసారం చేయబడుతుంది.

కనెక్షన్ నిర్మాణం నిర్వాహకుడు

యాజమాన్యం

  1. ఒక జమి అకౌంట్ కనెక్షన్ మేనేజర్ను కలిగి ఉంటుంది మరియు ఛానల్సోకెట్ వస్తువులకు (మల్టీప్లెక్స్డ్సోకెట్తో భాగస్వామ్యం చేయబడిన_ptr) ప్రాప్యత కలిగి ఉంటుంది.

  2. కనెక్షన్ మేనేజర్కు మల్టీప్లెక్స్డ్సోకెట్లు మరియు ఐసిఇ వస్తువులు ఉన్నాయి

  3. మల్టీప్లెక్స్డ్సోకెట్ TLS రవాణా మరియు ఛానల్సోకెట్ వస్తువులను కలిగి ఉంది

  4. ఛానల్సోకెట్ డేటా బఫర్లను కలిగి ఉంది

పాత్రలు

  1. కనెక్షన్ మేనేజర్ను సహచరులతో కనెక్షన్లను నిర్వహించడానికి ఉపయోగిస్తారు.

  2. మల్టీప్లెక్స్డ్సోకెట్లు TLSSocket ద్వారా డేటాను పంపడానికి, ఇన్కమింగ్ ప్యాకెట్లను చదవడానికి మరియు ఛానెల్లను నిర్వహించడానికి ఉపయోగించబడతాయి.

  3. ఇతర సహచరులతో పరస్పర చర్య చేయడానికి క్లయింట్ ChannelSockets ను ఉపయోగిస్తుంది.

వాడుక

సంబంధిత యూనిట్ పరీక్షలలో (test/unitTest/connectionManager/connectionManager. cpp) దృశ్యాలు వివరించబడ్డాయి.