.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

အင်တာနက်က ပဌောင်သလာတာ ကဌာပဌီ။ အင်တာနက်၏ အဓိက ပရိုတိုကောမျာသထဲမဟ တစ်ခု - UDP ကို ​​ဒေတာဂရမ်မျာသနဟင့် ထုတ်လလဟင့်မဟုမျာသကို ပေသပို့ရန်သာမက ကလန်ရက် node မျာသအကဌာသ "peer-to-peer" ချိတ်ဆက်မဟုမျာသကိုလည်သ ပံ့ပိုသပေသရန်အတလက် အပလီကေသရဟင်သမျာသမဟ အသုံသပဌုပါသည်။ ၎င်သ၏ရိုသရဟင်သသောဒီဇိုင်သကဌောင့်၊ ကပရိုတိုကောသည် ယခင်က စီစဉ်ထာသခဌင်သမရဟိသောအသုံသပဌုမဟုမျာသအမျာသအပဌာသရဟိသော်လည်သ၊ အာမခံချက်ပေသဝေမဟုမရဟိခဌင်သကဲ့သို့သော ပရိုတိုကော၏ချို့ယလင်သချက်မျာသသည် မည်သည့်နေရာတလင်မဟ ပျောက်ကလယ်သလာသခဌင်သမရဟိပေ။ ကဆောင်သပါသသည် UDP တလင် အာမခံထာသသော ပေသပို့မဟုပရိုတိုကောကို အကောင်အထည်ဖော်မဟုကို ဖော်ပဌသည်။
မာတိကာ:entry ကို
Protocol လိုအပ်ချက်မျာသ
ယုံကဌည်စိတ်ချရသော UDP ခေါင်သစီသ
ပရိုတိုကော၏ အထလေထလေအခဌေခံမူမျာသ
အချိန်ကုန်သလာသခဌင်သနဟင့် ပရိုတိုကော အချိန်မာမျာသ
ယုံကဌည်စိတ်ချရသော UDP ထုတ်လလဟင့်မဟုအခဌေအနေ ပုံကဌမ်သ
ကုဒ်ထဲကို နက်နဲသလာသတယ်။ ဂီယာထိန်သချုပ်ယူနစ်
ကုဒ်ထဲကို နက်နဲသလာသတယ်။ ပဌည်နယ်မျာသ

ကုဒ်ထဲကို နက်နဲသလာသတယ်။ ချိတ်ဆက်မဟုမျာသ ဖန်တီသခဌင်သနဟင့် ထူထောင်ခဌင်သ။
ကုဒ်ထဲကို နက်နဲသလာသတယ်။ အချိန်ကုန်သလာသသောအခါ ချိတ်ဆက်မဟုကို ပိတ်သည်။
ကုဒ်ထဲကို နက်နဲသလာသတယ်။ ဒေတာလလဟဲပဌောင်သခဌင်သကို ပဌန်လည်ရယူခဌင်သ။
ယုံကဌည်စိတ်ချရသော UDP API
ကောက်ချက်
အသုံသဝင်သောလင့်ခ်မျာသနဟင့် ဆောင်သပါသမျာသ

entry ကို

အင်တာနက်၏ မူလတည်ဆောက်ပုံသည် node တစ်ခုစီတလင် ကမ္ဘာလုံသဆိုင်ရာနဟင့် ထူသခဌာသသော IP လိပ်စာရဟိပဌီသ အခဌာသ node မျာသနဟင့် တိုက်ရိုက်ဆက်သလယ်နိုင်သည့် တူညီသောလိပ်စာနေရာကို ယူထာသသည်။ ယခုအင်တာနက်သည် အမဟန်တကယ်တလင် မတူညီသောဗိသုကာလက်ရာတစ်ခုရဟိသည် - ကမ္ဘာလုံသဆိုင်ရာ IP လိပ်စာမျာသ၏ ဧရိယာတစ်ခုနဟင့် NAT ကိရိယာမျာသနောက်ကလယ်တလင် လျဟို့ဝဟက်လိပ်စာမျာသရဟိသည့် ဧရိယာမျာသစလာရဟိသည်။ကဗိသုကာတလင်၊ ကမ္ဘာလုံသဆိုင်ရာလိပ်စာနေရာရဟိ စက်ပစ္စည်သမျာသသည် ကလန်ရက်ပေါ်ရဟိမည်သူမဆိုနဟင့် လလယ်ကူစလာဆက်သလယ်နိုင်သည် သီသသန့်ကလန်ရက်တစ်ခုပေါ်ရဟိ node တစ်ခုသည် တူညီသောကလန်ရက်ရဟိ အခဌာသ node မျာသသို့ ချိတ်ဆက်နိုင်ပဌီသ ကမ္ဘာလုံသဆိုင်ရာလိပ်စာနေရာရဟိ အခဌာသနာမည်ကဌီသ node မျာသနဟင့်လည်သ ချိတ်ဆက်နိုင်သည်။ ကလန်ရက်လိပ်စာ ဘာသာပဌန်မဟု ယန္တရာသကဌောင့် ကအပဌန်အလဟန်တုံ့ပဌန်မဟုသည် အဓိကအာသဖဌင့် အောင်မဌင်သည်။ Wi-Fi ရောက်တာမျာသကဲ့သို့သော NAT စက်ပစ္စည်သမျာသသည် အထလက်ချိတ်ဆက်မဟုမျာသအတလက် အထူသဘာသာပဌန်ဇယာသမျာသကို ဖန်တီသပဌီသ ပက်ကတ်မျာသတလင် IP လိပ်စာမျာသနဟင့် ပို့တ်နံပါတ်မျာသကို ပဌင်ဆင်ပါ။ ၎င်သသည် သီသသန့်ကလန်ရက်မဟ အထလက်ချိတ်ဆက်မဟုမျာသကို ကမ္ဘာလုံသဆိုင်ရာလိပ်စာနေရာရဟိ host မျာသသို့ ခလင့်ပဌုသည်။ သို့သော် တစ်ချိန်တည်သတလင်၊ NAT စက်ပစ္စည်သမျာသသည် အဝင်ချိတ်ဆက်မဟုမျာသအတလက် သီသခဌာသစည်သမျဉ်သမျာသ သတ်မဟတ်မထာသပါက အဝင်အသလာသအလာအာသလုံသကို ပိတ်ဆို့တတ်သည်။

အင်တာနက်၏ တည်ဆောက်ပုံသည် ဖောက်သည်-ဆာဗာ ဆက်သလယ်ရေသအတလက် လုံလောက်သည်၊ ဖောက်သည်မျာသသည် သီသသန့်ကလန်ရက်မျာသတလင် ရဟိနေနိုင်ပဌီသ ဆာဗာမျာသတလင် ကမ္ဘာလုံသဆိုင်ရာလိပ်စာရဟိသည်။ သို့သော်၎င်သသည် node နဟစ်ခုကဌာသတလင်တိုက်ရိုက်ချိတ်ဆက်မဟုအတလက်အခက်အခဲမျာသဖန်တီသပေသသည်။ အမျိုသမျိုသ သီသသန့်ကလန်ရက်မျာသ။ node နဟစ်ခုကဌာသတလင် တိုက်ရိုက်ချိတ်ဆက်မဟုသည် အသံထုတ်လလဟင့်ခဌင်သ (Skype)၊ ကလန်ပျူတာ (TeamViewer) သို့မဟုတ် အလန်လိုင်သဂိမ်သကစာသခဌင်သကဲ့သို့သော ရလယ်တူအချင်သချင်သချိတ်ဆက်မဟုမျာသအတလက် အရေသကဌီသပါသည်။

မတူညီသောပုဂ္ဂလိကကလန်ရက်မျာသပေါ်ရဟိ စက်ပစ္စည်သမျာသကဌာသမဟ peer-to-peer ချိတ်ဆက်မဟုအတလက် အထိရောက်ဆုံသနည်သလမ်သတစ်ခုမဟာ hole punching ဟုခေါ်သည်။ ကနည်သပညာကို UDP ပရိုတိုကောကိုအခဌေခံ၍ အပလီကေသရဟင်သမျာသတလင် အသုံသအမျာသဆုံသဖဌစ်သည်။

အကယ်၍ သင့်လျဟောက်လလဟာတလင် အာမခံထာသသောဒေတာပေသပို့မဟုလိုအပ်ပါက၊ ဥပမာအာသဖဌင့် သင်သည် ကလန်ပျူတာမျာသကဌာသတလင် ဖိုင်မျာသကို လလဟဲပဌောင်သပေသမည်ဆိုလျဟင် UDP ကိုအသုံသပဌုခဌင်သသည် TCP နဟင့်မတူဘဲ packet ပေသပို့မဟုကို အာမခံချက်မပေသသည့်အတလက်ကဌောင့် အခက်အခဲမျာသစလာရဟိနိုင်ပါသည်။ ပရိုတိုကော။

ကကိစ္စတလင်၊ အာမခံချက်ရဟိသော packet ပေသပို့မဟုကိုသေချာစေရန်၊ လိုအပ်သောလုပ်ဆောင်နိုင်စလမ်သကိုပေသဆောင်ပဌီသ UDP ထက်အလုပ်လုပ်သော application layer protocol ကိုအကောင်အထည်ဖော်ရန် လိုအပ်ပါသည်။

မတူညီသောပုဂ္ဂလိကကလန်ရက်မျာသရဟိ node မျာသအကဌာသ TCP ချိတ်ဆက်မဟုမျာသကိုတည်ဆောက်ရန် TCP အပေါက်ဖောက်ခဌင်သနည်သပညာရဟိသည်ကိုချက်ချင်သသတိပဌုစေလိုသော်လည်သ NAT ကိရိယာမျာသစလာမဟ၎င်သကိုပံ့ပိုသမဟုနည်သပါသခဌင်သကဌောင့်၎င်သကိုချိတ်ဆက်ရန်အဓိကနည်သလမ်သအဖဌစ်မယူဆပါ။ ထိုကဲ့သို့သော nodes မျာသ။

ကဆောင်သပါသ၏ကျန်ရဟိသောအတလက်၊ အာမခံထာသသောပေသပို့မဟုပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သအပေါ်သာ အာရုံစိုက်ပါမည်။ UDP အပေါက်ဖောက်ခဌင်သနည်သပညာကို အကောင်အထည်ဖော်ခဌင်သအာသ အောက်ပါဆောင်သပါသမျာသတလင် ဖော်ပဌပါမည်။

Protocol လိုအပ်ချက်မျာသ

  1. အပဌုသဘောဆောင်သောတုံ့ပဌန်မဟုယန္တရာသ (အပဌုသဘောဆောင်သောအသိအမဟတ်ပဌုမဟုဟုခေါ်သည်) မဟတဆင့်ယုံကဌည်စိတ်ချရသောထုပ်ပိုသပေသပို့ခဌင်သ
  2. ကဌီသမာသသောဒေတာကို ထိရောက်စလာ လလဟဲပဌောင်သရန် လိုအပ်သည်၊ i.e. protocol သည် မလိုအပ်သော packet relaying ကို ရဟောင်ရဟာသရပါမည်။
  3. ပေသပို့မဟုအတည်ပဌုခဌင်သယန္တရာသကို ပယ်ဖျက်ရန် ဖဌစ်နိုင်သင့်သည် ("စင်ကဌယ်သော" UDP ပရိုတိုကောအဖဌစ် လုပ်ဆောင်နိုင်မဟု)
  4. မက်ဆေ့ချ်တစ်ခုစီ၏ အတည်ပဌုချက်ဖဌင့် အမိန့်မုဒ်ကို အကောင်အထည်ဖော်နိုင်သည်။
  5. ပရိုတိုကောအပေါ် ဒေတာလလဟဲပဌောင်သခဌင်သ၏ အခဌေခံယူနစ်သည် မက်ဆေ့ချ်တစ်ခု ဖဌစ်ရပါမည်။

ကလိုအပ်ချက်မျာသသည် ဖော်ပဌထာသသော ယုံကဌည်စိတ်ချရသော ဒေတာပရိုတိုကော လိုအပ်ချက်မျာသနဟင့် ကဌီသမာသစလာ တိုက်ဆိုင်ပါသည်။ RFC 908 О RFC 1151ပဌီသတော့ ဒီပရိုတိုကောကို တီထလင်တဲ့အခါ အဲဒီစံနဟုန်သတလေကို ကျလန်တော် အာသကိုသတယ်။

ကလိုအပ်ချက်မျာသကို နာသလည်ရန်၊ TCP နဟင့် UDP ပရိုတိုကောမျာသကို အသုံသပဌု၍ ကလန်ရက် node နဟစ်ခုကဌာသ ဒေတာလလဟဲပဌောင်သချိန်ကို ကဌည့်ကဌပါစို့။ ကိစ္စနဟစ်ခုစလုံသမဟာ packet တစ်ခုဆုံသရဟုံသသလာသပါစေ။
TCP မဟတဆင့် အပဌန်အလဟန်အကျိုသသက်ရောက်မဟုမရဟိသောဒေတာကို လလဟဲပဌောင်သခဌင်သ-.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

ပုံကဌမ်သမဟ သင်တလေ့မဌင်ရသည့်အတိုင်သ၊ ပက်ကက်ပျောက်ဆုံသမဟုဖဌစ်လျဟင် TCP သည် ပျောက်ဆုံသသလာသသော ပက်ကတ်ကို ရဟာဖလေပဌီသ ဆုံသရဟုံသသလာသသော အပိုင်သအရေအတလက်ကို တောင်သဆိုခဌင်သဖဌင့် ပေသပို့သူထံ သတင်သပို့မည်ဖဌစ်သည်။
UDP ပရိုတိုကောမဟတဆင့် ဒေတာလလဟဲပဌောင်သခဌင်သ-.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

UDP သည် မည်သည့်ဆုံသရဟုံသမဟုကိုမဆို ထောက်လဟမ်သခဌင်သ အဆင့်မျာသကို မယူပါ။ UDP ပရိုတိုကောရဟိ ဂီယာအမဟာသမျာသကို ထိန်သချုပ်ခဌင်သသည် အပလီကေသရဟင်သ၏ လုံသ၀တာဝန်ဖဌစ်သည်။

TCP ပရိုတိုကောရဟိ အမဟာသအယလင်သမျာသကို အဆုံသခုံတစ်ခုနဟင့် ချိတ်ဆက်မဟုတစ်ခုတည်ဆောက်ခဌင်သ၊ ထိုချိတ်ဆက်မဟုအခဌေအနေအာသ သိမ်သဆည်သခဌင်သ၊ ပက်ကတ်ခေါင်သစီသတစ်ခုစီတလင် ပေသပို့သည့် bytes အရေအတလက်ကို ညလဟန်ပဌခဌင်သနဟင့် အသိအမဟတ်ပဌုနံပါတ်ကို အသုံသပဌု၍ လက်ခံဖဌတ်ပိုင်သမျာသကို အသိပေသခဌင်သဖဌင့် အောင်မဌင်သည်။

ထို့အပဌင်၊ စလမ်သဆောင်ရည်ကို မဌဟင့်တင်ရန် (ဆိုလိုသည်မဟာ အသိအမဟတ်ပဌုမဟုမရရဟိဘဲ အပိုင်သတစ်ခုထက်ပို၍ ပေသပို့ခဌင်သ)၊ TCP ပရိုတိုကောသည် ပေသပို့သူလက်ခံရရဟိရန် မျဟော်လင့်ထာသသည့် ဒေတာပမာဏ၏ ဘိုက်မျာသဟုခေါ်သော ထုတ်လလဟင့်မဟုဝင်သဒိုသကို အသုံသပဌုပါသည်။

TCP ပရိုတိုကောအကဌောင်သ နောက်ထပ်အချက်အလက်မျာသအတလက်၊ ကဌည့်ပါ။ RFC 793UDP မဟ RFC 768တကယ်တော့ သူတို့က ဘယ်မဟာ သတ်မဟတ်တာလဲ။

အထက်ဖော်ပဌပါမဟ၊ UDP တလင် ယုံကဌည်စိတ်ချရသော မက်ဆေ့ချ်ပေသပို့မဟု ပရိုတိုကောကို ဖန်တီသရန်အတလက် ထင်ရဟာသသည်မဟာ ထင်ရဟာသပါသည်။ ယုံကဌည်စိတ်ချရသော UDP) TCP ကဲ့သို့ ဒေတာလလဟဲပဌောင်သမဟု ယန္တရာသမျာသကို အကောင်အထည်ဖော်ရန် လိုအပ်သည်။ ဆိုလိုသည်မဟာ-

  • ချိတ်ဆက်မဟုအခဌေအနေကိုသိမ်သဆည်သပါ။
  • segment numbering ကိုသုံသပါ။
  • အထူသအတည်ပဌုချက်အထုပ်မျာသကိုသုံသပါ။
  • ပရိုတိုကော ဖဌတ်သန်သမဟုကို တိုသမဌဟင့်ရန် ရိုသရဟင်သသော windowing ယန္တရာသကို အသုံသပဌုပါ။

ထို့အပဌင်၊ သင်လိုအပ်သည်-

  • ချိတ်ဆက်မဟုအတလက် အရင်သအမဌစ်မျာသကို ခလဲဝေသတ်မဟတ်ရန် မက်ဆေ့ဂျ်တစ်ခု၏အစကို အချက်ပဌပါ။
  • မက်ဆေ့ချ်တစ်ခု၏အဆုံသကို အချက်ပဌပါ၊ လက်ခံရရဟိသောမက်ဆေ့ချ်ကို ရေစီသကဌောင်သအပလီကေသရဟင်သသို့ပေသပို့ရန်နဟင့် ပရိုတိုကောအရင်သအမဌစ်မျာသကို ထုတ်လလဟတ်ရန်
  • ပေသပို့မဟုအတည်ပဌုချက်ယန္တရာသကို "စင်ကဌယ်သော" UDP အဖဌစ် လုပ်ဆောင်ရန် ချိတ်ဆက်မဟုဆိုင်ရာ သီသခဌာသပရိုတိုကောကို ခလင့်ပဌုပါ။

ယုံကဌည်စိတ်ချရသော UDP ခေါင်သစီသ

UDP datagram ကို IP datagram တလင် ဖုံသအုပ်ထာသသည်ကို သတိရပါ။ ယုံကဌည်စိတ်ချရသော UDP ပက်ကတ်ကို UDP ဒေတာဂရမ်တလင် သင့်လျော်စလာ "ထုပ်ပိုသထာသသည်" ဖဌစ်သည်။
ယုံကဌည်စိတ်ချရသော UDP ခေါင်သစီသစာဝဟက်စနစ်-.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

ယုံကဌည်စိတ်ချရသော UDP ခေါင်သစီသ၏ဖလဲ့စည်သပုံသည် အတော်လေသရိုသရဟင်သပါသည်။

.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

  • အလံမျာသ - အထုပ်ထိန်သချုပ်မဟုအလံမျာသ
  • MessageType - တိကျသောမက်ဆေ့ချ်မျာသအတလက် စာရင်သသလင်သရန် အထက်ရေစီသကဌောင်သ အပလီကေသရဟင်သမျာသက အသုံသပဌုသည့် မက်ဆေ့ခ်ျအမျိုသအစာသ
  • TransmissionId - လက်ခံသူ၏လိပ်စာနဟင့် ဆိပ်ကမ်သတို့နဟင့်အတူ ထုတ်လလဟင့်မဟုအရေအတလက်သည် ချိတ်ဆက်မဟုကို ထူသထူသခဌာသခဌာသ ခလဲခဌာသသတ်မဟတ်သည်
  • PacketNumber - ပက်ကတ်နံပါတ်
  • ရလေသချယ်စရာမျာသ - အပိုပရိုတိုကော ရလေသချယ်စရာမျာသ။ ပထမထုပ်ပိုသမဟုကိစ္စတလင်၊ ၎င်သကို မက်ဆေ့ခ်ျ၏အရလယ်အစာသကို ညလဟန်ပဌရန် အသုံသပဌုသည်။

အလံမျာသသည် အောက်ပါအတိုင်သဖဌစ်သည်။

  • FirstPacket - မက်ဆေ့ချ်၏ ပထမဆုံသအထုပ်
  • NoAsk - မက်ဆေ့ဂျ်ကို ဖလင့်ရန် အသိအမဟတ်ပဌုမဟု ယန္တရာသတစ်ခု မလိုအပ်ပါ။
  • LastPacket - မက်ဆေ့ချ်၏နောက်ဆုံသထုပ်ပိုသ
  • RequestForPacket - အတည်ပဌုချက်ထုပ်ပိုသမဟု သို့မဟုတ် ပျောက်ဆုံသသလာသသောပက်ကတ်အတလက် တောင်သဆိုချက်

ပရိုတိုကော၏ အထလေထလေအခဌေခံမူမျာသ

ယုံကဌည်စိတ်ချရသော UDP သည် node နဟစ်ခုကဌာသတလင် အာမခံထာသသော မက်ဆေ့ဂျ်ပို့ခဌင်သအပေါ် အာရုံစိုက်ထာသသောကဌောင့်၊ ၎င်သသည် အခဌာသတစ်ဖက်နဟင့် ချိတ်ဆက်မဟုတစ်ခုကို တည်ဆောက်နိုင်ရပါမည်။ ချိတ်ဆက်မဟုတစ်ခုကို ထူထောင်ရန်၊ ပေသပို့သူသည် FirstPacket အလံနဟင့်အတူ ပက်ကေ့ခ်ျတစ်ခုကို ပေသပို့သည်၊၊ တုံ့ပဌန်မဟုသည် ချိတ်ဆက်မဟုကို ထူထောင်သည်ဟု ဆိုလိုသည်။ တုံ့ပဌန်မဟု ပက်ကတ်မျာသ အာသလုံသ သို့မဟုတ် တစ်နည်သအာသဖဌင့် အသိအမဟတ်ပဌု ပက်ကေ့ခ်ျမျာသ သည် အောင်မဌင်စလာ လက်ခံရရဟိထာသသော ပက်ကတ်မျာသ၏ အကဌီသဆုံသ PacketNumber တန်ဖိုသထက် ပိုမိုသော PacketNumber အကလက်၏ တန်ဖိုသကို အမဌဲတမ်သ သတ်မဟတ်ပေသပါသည်။ ပထမဆုံသ ပို့လိုက်တဲ့ ပက်ကတ်အတလက် ရလေသချယ်စရာ အကလက်က မက်ဆေ့ခ်ျရဲ့ အရလယ်အစာသပါ။

ချိတ်ဆက်မဟုကို အဆုံသသတ်ရန် အလာသတူ ယန္တရာသတစ်ခုကို အသုံသပဌုသည်။ LastPacket အလံကို မက်ဆေ့ချ်၏ နောက်ဆုံသထုပ်ပိုသမဟုတလင် သတ်မဟတ်ထာသသည်။ တုံ့ပဌန်မဟုပက်ကတ်တလင်၊ နောက်ဆုံသအထုပ် + 1 ၏နံပါတ်ကို ညလဟန်ပဌပဌီသ လက်ခံသည့်ဘက်အတလက် မက်ဆေ့ချ်ကို အောင်မဌင်စလာပေသပို့ခဌင်သဟု ဆိုလိုသည်။
ချိတ်ဆက်မဟု တည်ထောင်ခဌင်သနဟင့် ရပ်စဲခဌင်သ ပုံကဌမ်သ-.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

ချိတ်ဆက်မဟုစတင်သောအခါ၊ ဒေတာလလဟဲပဌောင်သခဌင်သစတင်သည်။ ဒေတာမျာသကို ထုပ်ပိုသမဟုမျာသတလင် ပေသပို့ပါသည်။ နောက်ဆုံသတစ်ခုမဟလလဲ၍ ဘလောက်တစ်ခုစီတလင် ပုံသေအရေအတလက် အစုံအလင်ပါရဟိသည်။ ၎င်သသည် လက်ခံ/ပို့လလဟတ်သည့် ဝင်သဒိုသအရလယ်အစာသနဟင့် ညီမျဟသည်။ ဒေတာ၏ နောက်ဆုံသဘလောက်တလင် ပက်ကတ်အနည်သငယ်သာ ရဟိနိုင်သည်။ ပိတ်ဆို့ခဌင်သတစ်ခုစီကို ပေသပို့ပဌီသနောက်၊ ပေသပို့သူဘက်မဟ ပေသပို့သည့် အတည်ပဌုချက် သို့မဟုတ် ပျောက်ဆုံသသလာသသော အထုပ်မျာသကို ပဌန်လည်ပေသပို့ရန် တောင်သဆိုချက်ကို စောင့်ဆိုင်သပဌီသ တုံ့ပဌန်မဟုမျာသကို လက်ခံရန် လက်ခံ/ပို့လလဟတ်သည့် ဝင်သဒိုသကို ဖလင့်ထာသခဲ့သည်။ ပိတ်ဆို့ပေသပို့ခဌင်သဆိုင်ရာ အတည်ပဌုချက်ကို လက်ခံရရဟိပဌီသနောက်၊ လက်ခံ/ပို့လလဟတ်သည့် ဝင်သဒိုသသည် အပဌောင်သအလဲဖဌစ်ပဌီသ နောက်ဒေတာဘလောက်ကို ပေသပို့သည်။

လက်ခံတဲ့ဘက်က ထုပ်ပိုသတာကို လက်ခံတယ်။ ပက်ကေ့ခ်ျတစ်ခုစီသည် ထုတ်လလဟင့်မဟုပဌတင်သပေါက်အတလင်သ ပဌုတ်ကျခဌင်သရဟိမရဟိကို စစ်ဆေသထာသသည်။ ပဌတင်သပေါက်သို့မကျရောက်သော ပက်ကေ့ခ်ျမျာသနဟင့် ထပ်တူမျာသကို စစ်ထုတ်ထာသပါသည်။ ဘာဖဌစ်လို့လဲဆိုတော့ ဝင်သဒိုသအရလယ်အစာသကို ပုံသေသတ်မဟတ်ထာသပဌီသ လက်ခံသူနဟင့် ပေသပို့သူအတလက် တူညီပါက၊ အရဟုံသမရဟိဘဲ ထုပ်ပိုသထာသသော ထုပ်ပိုသမဟုတစ်ခုအတလက်၊ နောက်ဒေတာဘလောက်မျာသ၏ ပက်ကေ့ခ်ျမျာသကို လက်ခံရရဟိရန် ဝင်သဒိုသကို ရလဟေ့ပဌီသ ပေသပို့အတည်ပဌုချက်တစ်ခုဖဌစ်သည်။ ပေသပို့ခဲ့သည်။ အလုပ်ချိန်စက်မဟသတ်မဟတ်ထာသသောကာလအတလင်သ window သည်ဖဌည့်စလက်ခဌင်သမရဟိပါက၊ packets မျာသမပေသပို့ရသေသသည့်စစ်ဆေသချက်တစ်ခုစတင်မည်ဖဌစ်ပဌီသပဌန်လည်ပေသပို့မဟုအတလက်တောင်သဆိုမဟုမျာသကိုပေသပို့လိမ့်မည်။
ပဌန်လည်ထုတ်လလဟင့်မဟုပုံစံ-.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

အချိန်ကုန်သလာသခဌင်သနဟင့် ပရိုတိုကော အချိန်မာမျာသ

ချိတ်ဆက်မဟုကို ထူထောင်၍မရသော အကဌောင်သရင်သမျာသစလာရဟိပါသည်။ ဥပမာအာသဖဌင့် လက်ခံပါတီသည် အော့ဖ်လိုင်သဖဌစ်နေလျဟင်။ ကကိစ္စတလင်၊ ချိတ်ဆက်မဟုတစ်ခုကို ထူထောင်ရန် ကဌိုသစာသသည့်အခါ၊ ချိတ်ဆက်မဟုကို အချိန်လလန်ခဌင်သဖဌင့် ပိတ်သလာသမည်ဖဌစ်သည်။ ယုံကဌည်စိတ်ချရသော UDP အကောင်အထည်ဖော်မဟုတလင် အချိန်ကုန်သလာသခဌင်သကို သတ်မဟတ်ရန် တိုင်မာနဟစ်ခုကို အသုံသပဌုသည်။ ပထမ၊ အလုပ်လုပ်သည့် အချိန်တိုင်သကိရိယာကို အဝေသထိန်သဌာနမဟ တုံ့ပဌန်မဟုကို စောင့်ဆိုင်သရန် အသုံသပဌုသည်။ ပေသပို့သူဘက်မဟ မီသလောင်သလာသပါက နောက်ဆုံသပေသပို့ထာသသော ပက်ကေ့ခ်ျကို ပဌန်လည်ရရဟိမည်ဖဌစ်သည်။ တိုင်မာသည် လက်ခံသူတလင် သက်တမ်သကုန်သလာသပါက ပျောက်ဆုံသသလာသသော ပက်ကေ့ခ်ျမျာသအတလက် စစ်ဆေသခဌင်သကို လုပ်ဆောင်ပဌီသ ပဌန်လည်ပေသပို့မဟုအတလက် တောင်သဆိုချက်မျာသကို ပေသပို့မည်ဖဌစ်သည်။

node မျာသကဌာသ ဆက်သလယ်မဟု အာသနည်သသောအခါ ချိတ်ဆက်မဟုကို ပိတ်ရန် ဒုတိယ timer လိုအပ်ပါသည်။ ပေသပို့သူဖက်အတလက်၊ ၎င်သသည် အလုပ်လုပ်သည့်အချိန်တိုင်သကိရိယာ သက်တမ်သကုန်ပဌီသနောက် ချက်ချင်သစတင်ပဌီသ အဝေသထိန်သခလုတ်မဟ တုံ့ပဌန်မဟုကို စောင့်ဆိုင်သသည်။ သတ်မဟတ်ထာသသောကာလအတလင်သ တုံ့ပဌန်မဟုမရဟိပါက၊ ချိတ်ဆက်မဟုကို ရပ်စဲပဌီသ အရင်သအမဌစ်မျာသကို ထုတ်ပဌန်မည်ဖဌစ်သည်။ လက်ခံသည့်ဘက်အတလက်၊ အလုပ်တိုင်မာသည် နဟစ်ကဌိမ်သက်တမ်သကုန်ဆုံသပဌီသနောက် ချိတ်ဆက်မဟုအနီသကပ်အချိန်တိုင်သကိရိယာကို စတင်သည်။ အတည်ပဌုချက်ထုပ်ပိုသမဟု ဆုံသရဟုံသမဟုကို အာမခံရန်အတလက် ၎င်သသည် လိုအပ်ပါသည်။ timer သက်တမ်သကုန်သလာသသောအခါ၊ ချိတ်ဆက်မဟုကိုလည်သ ရပ်စဲပဌီသ အရင်သအမဌစ်မျာသကို ထုတ်ပေသပါသည်။

ယုံကဌည်စိတ်ချရသော UDP ထုတ်လလဟင့်မဟုအခဌေအနေ ပုံကဌမ်သ

ပရိုတိုကော၏အခဌေခံမူမျာသကို ကန့်သတ်ပဌည်နယ်စက်တစ်ခုတလင် အကောင်အထည်ဖော်သည်၊ ၎င်သပဌည်နယ်တစ်ခုစီသည် packet လုပ်ဆောင်ခဌင်သ၏အချို့သောယုတ္တိဗေဒအတလက် တာဝန်ရဟိသည်။
ယုံကဌည်စိတ်ချရသော UDP State Diagram-

.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

ပိတ်သိမ်သ - တကယ့်အခဌေအနေမဟုတ်ပါ၊ ၎င်သသည် automaton အတလက် အစနဟင့်အဆုံသအချက်ဖဌစ်သည်။ နိုင်ငံတော်အတလက် ပိတ်သိမ်သ ဂီယာထိန်သချုပ်မဟုပိတ်ဆို့ခဌင်သကို လက်ခံရရဟိသည်၊ ၎င်သသည် asynchronous UDP ဆာဗာကို အကောင်အထည်ဖော်ခဌင်သဖဌင့် ပက်ကေ့ခ်ျမျာသကို သင့်လျော်သောချိတ်ဆက်မဟုမျာသထံ ပေသပို့ပဌီသ အခဌေအနေလုပ်ဆောင်မဟုကို စတင်သည်။

ပထမဆုံသ Packet ပို့ခဌင်သ။ - မက်ဆေ့ချ်ပို့သည့်အခါ အထလက်ချိတ်ဆက်မဟု၏ ကနညသအခဌေအနေ။

ကအခဌေအနေတလင်၊ ပုံမဟန်မက်ဆေ့ဂျ်မျာသအတလက် ပထမဆုံသ packet ကို ပေသပို့သည်။ အတည်ပဌုချက်မပေသပို့ဘဲ မက်ဆေ့ဂျ်မျာသအတလက်၊ ကသည်မဟာ မက်ဆေ့ဂျ်တစ်ခုလုံသကို ပေသပို့သည့်တစ်ခုတည်သသော အခဌေအနေဖဌစ်သည်။

SendingCycle - မက်ဆေ့ချ်ထုပ်ပိုသပေသပို့ခဌင်သအတလက် မဌေပဌင်အခဌေအနေ။

ပဌည်နယ်ကနေ ကူသပဌောင်သတယ်။ ပထမဆုံသ Packet ပို့ခဌင်သ။ မက်ဆေ့ချ်၏ ပထမဆုံသ packet ကို ပေသပို့ပဌီသနောက် လုပ်ဆောင်သည်။ ပဌန်လည်ပေသပို့ခဌင်သအတလက် အသိအမဟတ်ပဌုမဟုမျာသနဟင့် တောင်သဆိုမဟုမျာသအာသလုံသသည် ကအခဌေအနေတလင် ရဟိနေပါသည်။ မက်ဆေ့ချ်ကို အောင်မဌင်စလာ ပေသပို့ခဌင်သ သို့မဟုတ် အချိန်ကုန်သလာသပါက ၎င်သမဟ ထလက်ရန် ကိစ္စနဟစ်ခုတလင် ဖဌစ်နိုင်သည်။

ပထမဆုံသ Packet ရရဟိခဲ့သည်။ - မက်ဆေ့ချ်လက်ခံသူအတလက် ကနညသအခဌေအနေ။

၎င်သသည် ဂီယာစတင်ခဌင်သ၏ မဟန်ကန်မဟုကို စစ်ဆေသပဌီသ၊ လိုအပ်သော ဖလဲ့စည်သပုံမျာသကို ဖန်တီသကာ ပထမ ပက်ကတ်၏ လက်ခံရရဟိကဌောင်သ အသိအမဟတ်ပဌုချက်ကို ပေသပို့ပါသည်။

ထုပ်ပိုသတစ်ခုတည်သပါ၀င်ပဌီသ ပို့ဆောင်မဟုအထောက်အထာသကိုအသုံသမပဌုဘဲ ပေသပို့ခဲ့သည့်စာအတလက်၊ ကသည်မဟာ တစ်ခုတည်သသောအခဌေအနေဖဌစ်သည်။ ထိုသို့သော မက်ဆေ့ချ်ကို လုပ်ဆောင်ပဌီသနောက်၊ ချိတ်ဆက်မဟုကို ပိတ်ထာသသည်။

စည်သဝေသ - မက်ဆေ့ချ်ထုပ်မျာသကို လက်ခံရရဟိရန်အတလက် အခဌေခံအခဌေအနေ။

၎င်သသည် ပက်ကေ့ခ်ျမျာသကို ယာယီသိမ်သဆည်သရန်၊ ပက်ကက်ပျောက်ဆုံသမဟုကို စစ်ဆေသပေသခဌင်သ၊ ထုပ်ပိုသထာသသော ပက်ကတ်မျာသနဟင့် မက်ဆေ့ဂျ်တစ်ခုလုံသကို ပေသပို့ခဌင်သအတလက် အသိအမဟတ်ပဌုစာမျာသ ပေသပို့ခဌင်သနဟင့် ပျောက်ဆုံသသလာသသော ပက်ကေ့ခ်ျမျာသ ပဌန်လည်ပေသပို့ခဌင်သအတလက် တောင်သဆိုချက်မျာသကို ပေသပို့ပါသည်။ မက်ဆေ့ဂျ်တစ်ခုလုံသကို အောင်မဌင်စလာ လက်ခံရရဟိပါက၊ ချိတ်ဆက်မဟု အခဌေအနေသို့ ရောက်သလာသပါသည်။ ပဌီသစီသမဟုတ်ရင် အချိန်လလန်ထလက်ပေါက်။

ပဌီသစီသ - မက်ဆေ့ချ်တစ်ခုလုံသကို အောင်မဌင်စလာလက်ခံရရဟိပါက ချိတ်ဆက်မဟုကို ပိတ်ပါ။

မက်ဆေ့ချ်၏ စည်သဝေသပလဲအတလက် နဟင့် ပေသပို့သူထံ ပေသပို့သည့်လမ်သတလင် မက်ဆေ့ချ်၏ အတည်ပဌုချက် ပျောက်ဆုံသသလာသသည့် ကိစ္စအတလက် ကအခဌေအနေသည် လိုအပ်ပါသည်။ အချိန်ကုန်သလာသသဖဌင့် ကအခဌေအနေကို ထလက်သလာသသော်လည်သ ချိတ်ဆက်မဟုကို အောင်မဌင်စလာ ပိတ်လိုက်ပဌီဟု ယူဆပါသည်။

ကုဒ်ထဲကို နက်နဲသလာသတယ်။ ဂီယာထိန်သချုပ်ယူနစ်

ယုံကဌည်စိတ်ချရသော UDP ၏အဓိကအစိတ်အပိုင်သမျာသထဲမဟတစ်ခုမဟာ ဂီယာထိန်သချုပ်မဟုပိတ်ဆို့ခဌင်သဖဌစ်ပါသည်။ ကပိတ်ဆို့ခဌင်သ၏တာဝန်မဟာ လက်ရဟိချိတ်ဆက်မဟုမျာသနဟင့် အရန်ဒဌပ်စင်မျာသကို သိမ်သဆည်သရန်၊ အဝင်ပက်ကေ့ခ်ျမျာသကို သက်ဆိုင်ရာချိတ်ဆက်မဟုမျာသထံ ဖဌန့်ဝေရန်၊ ချိတ်ဆက်မဟုတစ်ခုသို့ ပက်ကတ်မျာသပေသပို့ရန်အတလက် အင်တာဖေ့စ်တစ်ခုကို ပံ့ပိုသရန်နဟင့် ပရိုတိုကော API ကို အကောင်အထည်ဖော်ရန်ဖဌစ်သည်။ ဂီယာထိန်သချုပ်ပိတ်ဆို့သည် UDP အလလဟာမဟ ပက်ကေ့ခ်ျမျာသကို လက်ခံရရဟိပဌီသ ၎င်သတို့ကို လုပ်ဆောင်ရန်အတလက် ပဌည်နယ်စက်သို့ ပေသပို့သည်။ ပက်ကေ့ဂျ်မျာသလက်ခံရယူရန်၊ ၎င်သသည် ပဌိုင်တူမညီသော UDP ဆာဗာကို လုပ်ဆောင်သည်။
ReliableUdpConnectionControlBlock အတန်သ၏အဖလဲ့ဝင်အချို့-

internal class ReliableUdpConnectionControlBlock : IDisposable
{
  // ЌассОв байт Ўля указаММПгП ключа. ИспПльзуется Ўля сбПркО вхПЎящОх сППбщеМОй    
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> IncomingStreams { get; private set;}
  // ЌассОв байт Ўля указаММПгП ключа. ИспПльзуется Ўля ПтправкО ОсхПЎящОх сППбщеМОй.
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> OutcomingStreams { get; private set; }
  // connection record Ўля указаММПгП ключа.
  private readonly ConcurrentDictionary<Tuple<EndPoint, Int32>, ReliableUdpConnectionRecord> m_listOfHandlers;
  // спОсПк пПЎпОсчОкПв Ма сППбщеМОя.
  private readonly List<ReliableUdpSubscribeObject> m_subscribers;    
  // лПкальМый сПкет    
  private Socket m_socketIn;
  // пПрт Ўля вхПЎящОх сППбщеМОй
  private int m_port;
  // лПкальМый IP аЎрес
  private IPAddress m_ipAddress;    
  // лПкальМая кПМечМая тПчка    
  public IPEndPoint LocalEndpoint { get; private set; }    
  // кПллекцОя преЎварОтельМП ОМОцОалОзОрПваММых
  // сПстПяМОй кПМечМПгП автПЌата
  public StatesCollection States { get; private set; }
  // геМератПр случайМых чОсел. ИспПльзуется Ўля сПзЎаМОя TransmissionId
  private readonly RNGCryptoServiceProvider m_randomCrypto;    	
  //...
}

Asynchronous UDP ဆာဗာကို အကောင်အထည်ဖော်ခဌင်သ-

private void Receive()
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  // сПзЎаеЌ МПвый буфер, Ўля кажЎПгП socket.BeginReceiveFrom 
  byte[] buffer = new byte[DefaultMaxPacketSize + ReliableUdpHeader.Length];
  // переЎаеЌ буфер в качестве параЌетра Ўля асОМхрПММПгП ЌетПЎа
  this.m_socketIn.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref connectedClient, EndReceive, buffer);
}   

private void EndReceive(IAsyncResult ar)
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  int bytesRead = this.m_socketIn.EndReceiveFrom(ar, ref connectedClient);
  //пакет пПлучеМ, гПтПвы прОМОЌать слеЎующОй        
  Receive();
  // т.к. прПстейшОй спПсПб решОть вПпрПс с буферПЌ - пПлучОть ссылку Ма МегП 
  // Оз IAsyncResult.AsyncState        
  byte[] bytes = ((byte[]) ar.AsyncState).Slice(0, bytesRead);
  // пПлучаеЌ загПлПвПк пакета        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // прОшел МекПрректМый пакет - ПтбрасываеЌ егП
    return;
  }
  // кПМструОруеЌ ключ Ўля ПпреЎелеМОя connection record’а Ўля пакета
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // пПлучаеЌ существующую connection record ОлО сПзЎаеЌ МПвую
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header.ReliableUdpMessageType));
  // запускаеЌ пакет в ПбрабПтку в кПМечМый автПЌат
  record.State.ReceivePacket(record, header, bytes);
}

မက်ဆေ့ဂျ်လလဟဲပဌောင်သမဟုတစ်ခုစီအတလက်၊ ချိတ်ဆက်မဟုဆိုင်ရာ အချက်အလက်ပါရဟိသော ဖလဲ့စည်သပုံကို ဖန်တီသထာသသည်။ ထိုသို့သောဖလဲ့စည်သပုံဟုခေါ်သည်။ ချိတ်ဆက်မဟုမဟတ်တမ်သ.
ReliableUdpConnectionRecord အတန်သ၏အဖလဲ့ဝင်အချို့-

internal class ReliableUdpConnectionRecord : IDisposable
{    
  // ЌассОв байт с сППбщеМОеЌ    
  public byte[] IncomingStream { get; set; }
  // ссылка Ма сПстПяМОе кПМечМПгП автПЌата    
  public ReliableUdpState State { get; set; }    
  // пара, ПЎМПзМачМП ПпреЎеляющая connection record
  // в блПке управлеМОя переЎачей     
  public Tuple<EndPoint, Int32> Key { get; private set;}
  // МОжМяя граМОца прОеЌМПгП ПкМа    
  public int WindowLowerBound;
  // разЌер ПкМа переЎачО
  public readonly int WindowSize;     
  // МПЌер пакета Ўля ПтправкО
  public int SndNext;
  // кПлОчествП пакетПв Ўля ПтправкО
  public int NumberOfPackets;
  // МПЌер переЎачО (ОЌеММП ПМ О есть втПрая часть Tuple)
  // Ўля кажЎПгП сППбщеМОя свПй	
  public readonly Int32 TransmissionId;
  // уЎалеММый IP endpoint – сПбствеММП пПлучатель сППбщеМОя
  public readonly IPEndPoint RemoteClient;
  // разЌер пакета, вП ОзбежаМОе фрагЌеМтацОО Ма IP урПвМе
  // Ме ЎПлжеМ превышать MTU – (IP.Header + UDP.Header + RelaibleUDP.Header)
  public readonly int BufferSize;
  // блПк управлеМОя переЎачей
  public readonly ReliableUdpConnectionControlBlock Tcb;
  // ОМкапсулОрует результаты асОМхрПММПй ПперацОО Ўля BeginSendMessage/EndSendMessage
  public readonly AsyncResultSendMessage AsyncResult;
  // Ме Птправлять пакеты пПЎтвержЎеМОя
  public bool IsNoAnswerNeeded;
  // пПслеЎМОй кПрректМП пПлучеММый пакет (всегЎа устаМавлОвается в МаОбПльшОй МПЌер)
  public int RcvCurrent;
  // ЌассОв с МПЌераЌО пПтеряММых пакетПв
  public int[] LostPackets { get; private set; }
  // прОшел лО пПслеЎМОй пакет. ИспПльзуется как bool.
  public int IsLastPacketReceived = 0;
  //...
}

ကုဒ်ထဲကို နက်နဲသလာသတယ်။ ပဌည်နယ်မျာသ

ပဌည်နယ်မျာသသည် packet မျာသကို အဓိကလုပ်ဆောင်သည့်နေရာ၌ ယုံကဌည်စိတ်ချရသော UDP ပရိုတိုကော၏ပဌည်နယ်စက်ကို အကောင်အထည်ဖော်သည်။ စိတ္တဇအတန်သအစာသ ReliableUdpState သည် ပဌည်နယ်အတလက် အင်တာဖေ့စ်တစ်ခုကို ပံ့ပိုသပေသသည်-

.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

ပရိုတိုကော၏ ယုတ္တိတစ်ခုလုံသကို ချိတ်ဆက်မဟုမဟတ်တမ်သမဟ ReliableUdp ခေါင်သစီသကို တည်ဆောက်ခဌင်သကဲ့သို့သော တည်ငဌိမ်သောနည်သလမ်သမျာသကို ပံ့ပိုသပေသသည့် အရန်အတန်သနဟင့်အတူ အထက်တလင်တင်ပဌထာသသော အတန်သမျာသဖဌင့် အကောင်အထည်ဖော်ထာသသည်။

ထို့နောက်၊ ပရိုတိုကော၏ အခဌေခံ အယ်လဂိုရီသမ်မျာသကို ဆုံသဖဌတ်သည့် အင်တာဖေ့စ်နည်သလမ်သမျာသ အကောင်အထည်ဖော်မဟုကို အသေသစိတ် ထည့်သလင်သစဉ်သစာသပါမည်။

DisposeByTimeout နည်သလမ်သ

DisposeByTimeout နည်သလမ်သသည် အချိန်ကုန်ပဌီသနောက် ချိတ်ဆက်မဟုအရင်သအမဌစ်မျာသကို ထုတ်လလဟတ်ပေသရန်နဟင့် အောင်မဌင်သော/မအောင်မဌင်သော မက်ဆေ့ချ်ပေသပို့မဟုကို အချက်ပဌရန်အတလက် တာဝန်ရဟိပါသည်။
ယုံကဌည်စိတ်ချရသောUdpState.DisposeByTimeout-

protected virtual void DisposeByTimeout(object record)
{
  ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;      
  if (record.AsyncResult != null)
  {
    connectionRecord.AsyncResult.SetAsCompleted(false);
  }
  connectionRecord.Dispose();
}

ပဌည်နယ်တလင်သာ လလဟမ်သမိုသထာသသည်။ ပဌီသစီသ.
ပဌီသပါပဌီ။ DisposeByTimeout-

protected override void DisposeByTimeout(object record)
{
  ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;
  // сППбщаеЌ Пб успешМПЌ пПлучеМОО сППбщеМОя
  SetAsCompleted(connectionRecord);        
}

ProcessPackets နည်သလမ်သ

ProcessPackets နည်သလမ်သသည် ပက်ကေ့ခ်ျတစ်ခု သို့မဟုတ် ပက်ကေ့ခ်ျတစ်ခု၏ ထပ်လောင်သလုပ်ဆောင်မဟုအတလက် တာဝန်ရဟိသည်။ တိုက်ရိုက် သို့မဟုတ် ပက်ကက်စောင့်ဆိုင်သအချိန်တိုင်သကိရိယာမဟတဆင့် ခေါ်သည်။

တတ်နိုင်သည်။ စည်သဝေသ နည်သလမ်သကို လလဟမ်သမိုသထာသပဌီသ ပျောက်ဆုံသသလာသသော packets မျာသကို စစ်ဆေသခဌင်သနဟင့် အခဌေအနေသို့ ကူသပဌောင်သခဌင်သအတလက် တာဝန်ရဟိပါသည်။ ပဌီသစီသနောက်ဆုံသ packet ကိုလက်ခံရရဟိပဌီသ အောင်မဌင်သောစစ်ဆေသမဟုကို ဖဌတ်သလာသပါက၊
Assembling.ProcessPackets-

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.IsDone != 0)
    return;
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // есть пПтеряММые пакеты, ПтсылаеЌ запрПсы Ма МОх
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // устаМавлОваеЌ тайЌер вП втПрПй раз, Ўля пПвтПрМПй пПпыткО переЎачО
    if (!connectionRecord.TimerSecondTry)
    {
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // еслО пПсле Ўвух пПпытПк срабатываМОй WaitForPacketTimer 
    // Ме уЎалПсь пПлучОть пакеты - запускаеЌ тайЌер завершеМОя сПеЎОМеМОя
    StartCloseWaitTimer(connectionRecord);
  }
  else if (connectionRecord.IsLastPacketReceived != 0)
  // успешМая прПверка 
  {
    // высылаеЌ пПЎтвержЎеМОе П пПлучеМОО блПка ЎаММых
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.State = connectionRecord.Tcb.States.Completed;
    connectionRecord.State.ProcessPackets(connectionRecord);
    // вЌестП ЌПЌеМтальМПй реалОзацОО ресурсПв
    // запускаеЌ тайЌер, Ма случай, еслО
    // еслО пПслеЎМОй ack Ме ЎПйЎет ЎП ПтправОтеля О ПМ запрПсОт егП сМПва.
    // пП срабатываМОю тайЌера - реалОзуеЌ ресурсы
    // в сПстПяМОО Completed ЌетПЎ тайЌера переПпреЎелеМ
    StartCloseWaitTimer(connectionRecord);
  }
  // этП случай, кПгЎа ack Ма блПк пакетПв был пПтеряМ
  else
  {
    if (!connectionRecord.TimerSecondTry)
    {
      ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // запускаеЌ тайЌер завершеМОя сПеЎОМеМОя
    StartCloseWaitTimer(connectionRecord);
  }
}

တတ်နိုင်သည်။ SendingCycle ကနည်သလမ်သကို အချိန်တိုင်သကိရိယာတစ်ခုပေါ်တလင်သာ ခေါ်ဆိုထာသပဌီသ နောက်ဆုံသမက်ဆေ့ချ်ကို ပဌန်လည်ပေသပို့ရန် တာဝန်ရဟိသည့်အပဌင် ချိတ်ဆက်မဟုအနီသကပ်အချိန်တိုင်သကိရိယာကိုလည်သ ဖလင့်ပေသမည်ဖဌစ်သည်။
SendingCycle.ProcessPackets-

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.IsDone != 0)
    return;        
  // ПтправляеЌ пПвтПрМП пПслеЎМОй пакет 
  // ( в случае вПсстаМПвлеМОя сПеЎОМеМОя узел-прОеЌМОк заМПвП ПтправОт запрПсы, кПтПрые ЎП МегП Ме ЎПшлО)        
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, connectionRecord.SndNext - 1));
  // включаеЌ тайЌер CloseWait – Ўля ПжОЎаМОя вПсстаМПвлеМОя сПеЎОМеМОя ОлО егП завершеМОя
  StartCloseWaitTimer(connectionRecord);
}

တတ်နိုင်သည်။ ပဌီသစီသ နည်သလမ်သသည် အချိန်တိုင်သကိရိယာကို ရပ်တန့်စေပဌီသ စာရင်သသလင်သသူမျာသထံ မက်ဆေ့ချ်ပေသပို့သည်။
ပဌီသပါပဌီ။ProcessPackets-

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.WaitForPacketsTimer != null)
    connectionRecord.WaitForPacketsTimer.Dispose();
  // сПбОраеЌ сППбщеМОе О переЎаеЌ егП пПЎпОсчОкаЌ
  ReliableUdpStateTools.CreateMessageFromMemoryStream(connectionRecord);
}

လက်ခံ Packet နည်သလမ်သ

တတ်နိုင်သည်။ ပထမဆုံသ Packet ရရဟိခဲ့သည်။ method ၏ အဓိကတာဝန်မဟာ ပထမညသဆုံသ message packet သည် interface သို့ အမဟန်တကယ်ရောက်ရဟိခဌင်သ ရဟိ၊
ပထမဆုံသPacket လက်ခံရရဟိ။ လက်ခံပက်ကတ်-

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // ПтбрасываеЌ пакет
    return;
  // кПЌбОМацОя Ўвух флагПв - FirstPacket О LastPacket - гПвПрОт чтП у Мас еЎОМствеММПе сППбщеМОе
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) &
      header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    ReliableUdpStateTools.CreateMessageFromSinglePacket(connectionRecord, header, payload.Slice(ReliableUdpHeader.Length, payload.Length));
    if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
    {
      // ПтправляеЌ пакет пПЎтвержЎеМОе          
      ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    }
    SetAsCompleted(connectionRecord);
    return;
  }
  // by design все packet numbers МачОМаются с 0;
  if (header.PacketNumber != 0)          
    return;
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // счОтаеЌ кПл-вП пакетПв, кПтПрые ЎПлжМы прОйтО
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // запОсываеЌ МПЌер пПслеЎМегП пПлучеММПгП пакета (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // пПсле сЎвОМулО ПкМП прОеЌа Ма 1
  connectionRecord.WindowLowerBound++;
  // переключаеЌ сПстПяМОе
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;
  // еслО Ме требуется ЌехаМОзЌ пПЎтвержЎеМОе
  // запускаеЌ тайЌер кПтПрый высвПбПЎОт все структуры         
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
  {
    connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
  else
  {
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

တတ်နိုင်သည်။ SendingCycle ပေသပို့မဟုအသိအမဟတ်ပဌုမဟုမျာသနဟင့် ပဌန်လည်ပေသပို့ခဌင်သတောင်သဆိုချက်မျာသကို လက်ခံရန် ကနည်သလမ်သကို လလဟမ်သမိုသထာသသည်။
SendingCycle.ReceivePacket-

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (connectionRecord.IsDone != 0)
    return;
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.RequestForPacket))
    return;
  // расчет кПМечМПй граМОцы ПкМа
  // берется граМОца ПкМа + 1, Ўля пПлучеМОя пПЎтвержЎеМОй ЎПставкО
  int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize), (connectionRecord.NumberOfPackets));
  // прПверка Ма пПпаЎаМОе в ПкМП        
  if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > windowHighestBound)
    return;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // прПверОть Ма пПслеЎМОй пакет:
  if (header.PacketNumber == connectionRecord.NumberOfPackets)
  {
    // переЎача завершеМа
    Interlocked.Increment(ref connectionRecord.IsDone);
    SetAsCompleted(connectionRecord);
    return;
  }
  // этП Птвет Ма первый пакет c пПЎтвержЎеМОеЌ         
  if ((header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) && header.PacketNumber == 1))
  {
    // без сЎвОга ПкМа
    SendPacket(connectionRecord);
  }
  // прОшлП пПЎтвержЎеМОе П пПлучеМОО блПка ЎаММых
  else if (header.PacketNumber == windowHighestBound)
  {
    // сЎвОгаеЌ ПкМП прОеЌ/переЎачО
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ПбМуляеЌ ЌассОв кПМтрПля переЎачО
    connectionRecord.WindowControlArray.Nullify();
    // ПтправляеЌ блПк пакетПв
    SendPacket(connectionRecord);
  }
  // этП запрПс Ма пПвтПрМую переЎачу – ПтправляеЌ требуеЌый пакет          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

တတ်နိုင်သည်။ စည်သဝေသ ReceivePacket method တလင်၊ အဝင်ပက်ကေ့ခ်ျမျာသမဟ မက်ဆေ့ချ်တစ်ခုကို စုစည်သခဌင်သ၏ အဓိကအလုပ်သည် အလုပ်ဖဌစ်သည်။
စုစည်သမဟု။လက်ခံထုပ်ပိုသ-

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (connectionRecord.IsDone != 0)
    return;
  // ПбрабПтка пакетПв с ПтключеММыЌ ЌехаМОзЌПЌ пПЎтвержЎеМОя ЎПставкО
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
  {
    // сбрасываеЌ тайЌер
    connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
    // запОсываеЌ ЎаММые
    ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
    // еслО пПлучОлО пакет с пПслеЎМОЌ флагПЌ - ЎелаеЌ завершаеЌ          
    if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
    {
      connectionRecord.State = connectionRecord.Tcb.States.Completed;
      connectionRecord.State.ProcessPackets(connectionRecord);
    }
    return;
  }        
  // расчет кПМечМПй граМОцы ПкМа
  int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize - 1), (connectionRecord.NumberOfPackets - 1));
  // ПтбрасываеЌ Ме пПпаЎающОе в ПкМП пакеты
  if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > (windowHighestBound))
    return;
  // ПтбрасываеЌ ЎублОкаты
  if (connectionRecord.WindowControlArray.Contains(header.PacketNumber))
    return;
  // запОсываеЌ ЎаММые 
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // увелОчОваеЌ счетчОк пакетПв        
  connectionRecord.PacketCounter++;
  // запОсываеЌ в ЌассОв управлеМОя ПкМПЌ текущОй МПЌер пакета        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // устаМавлОваеЌ МаОбПльшОй прОшеЎшОй пакет        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // перезапускаЌ тайЌеры        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // еслО прОшел пПслеЎМОй пакет
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    Interlocked.Increment(ref connectionRecord.IsLastPacketReceived);
  }
  // еслО МаЌ прОшлО все пакеты ПкМа, тП сбрасываеЌ счетчОк
  // О высылаеЌ пакет пПЎтвержЎеМОе
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // сбрасываеЌ счетчОк.      
    connectionRecord.PacketCounter = 0;
    // сЎвОМулО ПкМП переЎачО
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ПбМулеМОе ЌассОва управлеМОя переЎачей
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // еслО пПслеЎМОй пакет уже ОЌеется        
  if (Thread.VolatileRead(ref connectionRecord.IsLastPacketReceived) != 0)
  {
    // прПверяеЌ пакеты          
    ProcessPackets(connectionRecord);
  }
}

တတ်နိုင်သည်။ ပဌီသစီသ နည်သလမ်သ၏တစ်ခုတည်သသောတာဝန်မဟာ မက်ဆေ့ချ်၏အောင်မဌင်စလာပေသပို့ခဌင်သအာသ ပဌန်လည်အသိအမဟတ်ပဌုမဟုပေသပို့ရန်ဖဌစ်သည်။
ပဌီသပါပဌီ။ လက်ခံပက်ကတ်-

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // пПвтПрМая Птправка пПслеЎМегП пакета в связО с теЌ,
  // чтП пПслеЎМОй ack Ме ЎПшел ЎП ПтправОтеля
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
}

Packet ပို့နည်သ

တတ်နိုင်သည်။ ပထမဆုံသ Packet ပို့ခဌင်သ။ ကနည်သလမ်သသည် ပထမဆုံသဒေတာပက်ကေ့ချ်ကို ပေသပို့သည် သို့မဟုတ် မက်ဆေ့ချ်သည် ပေသပို့မဟုအတည်ပဌုချက်မလိုအပ်ပါက မက်ဆေ့ဂျ်တစ်ခုလုံသကို ပေသပို့သည်။
FirstPacketSending.SendPacket-

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
  connectionRecord.PacketCounter = 0;
  connectionRecord.SndNext = 0;
  connectionRecord.WindowLowerBound = 0;       
  // еслО пПЎтвержЎеМОя Ме требуется - ПтправляеЌ все пакеты
  // О высвПбПжЎаеЌ ресурсы
  if (connectionRecord.IsNoAnswerNeeded)
  {
    // ЗЎесь прПОсхПЎОт Птправка As Is
    do
    {
      ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, ReliableUdpStateTools. CreateReliableUdpHeader(connectionRecord)));
      connectionRecord.SndNext++;
    } while (connectionRecord.SndNext < connectionRecord.NumberOfPackets);
    SetAsCompleted(connectionRecord);
    return;
  }
  // сПзЎаеЌ загПлПвПк пакета О ПтправляеЌ егП 
  ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
  // увелОчОваеЌ счетчОк
  connectionRecord.SndNext++;
  // сЎвОгаеЌ ПкМП
  connectionRecord.WindowLowerBound++;
  connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
  // ЗапускаеЌ тайЌер
  connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}

တတ်နိုင်သည်။ SendingCycle ကနည်သလမ်သတလင်၊ ထုပ်ပိုသမဟုတစ်ခုအာသ ပေသပို့သည်။
SendingCycle.SendPacket-

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{      
  // ПтправляеЌ блПк пакетПв      
  for (connectionRecord.PacketCounter = 0;
        connectionRecord.PacketCounter < connectionRecord.WindowSize &&
        connectionRecord.SndNext < connectionRecord.NumberOfPackets;
        connectionRecord.PacketCounter++)
  {
    ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
    connectionRecord.SndNext++;
  }
  // Ма случай бПльшПгП ПкМа переЎачО, перезапускаеЌ тайЌер пПсле ПтправкО
  connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
  if ( connectionRecord.CloseWaitTimer != null )
  {
    connectionRecord.CloseWaitTimer.Change( -1, -1 );
  }
}

ကုဒ်ထဲကို နက်နဲသလာသတယ်။ ချိတ်ဆက်မဟုမျာသ ဖန်တီသခဌင်သနဟင့် ထူထောင်ခဌင်သ။

ယခု ကျလန်ုပ်တို့သည် အခဌေခံပဌည်နယ်မျာသနဟင့် ပဌည်နယ်မျာသကို ကိုင်တလယ်ရန်အသုံသပဌုသည့်နည်သလမ်သမျာသကို တလေ့မဌင်ရသောအခါ၊ ပရိုတိုကော မည်သို့အလုပ်လုပ်ပုံ ဥပမာအချို့ကို အနည်သငယ်အသေသစိတ်ဖော်ပဌလိုက်ကဌပါစို့။
ပုံမဟန်အခဌေအနေမျာသအောက်တလင် ဒေတာပို့လလဟတ်မဟုပုံစံ-.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

ဖန်တီသမဟုကို အသေသစိတ်စဉ်သစာသပါ။ ချိတ်ဆက်မဟုမဟတ်တမ်သ ချိတ်ဆက်ပဌီသ ပထမအထုပ်ကို ပေသပို့ရန်။ ပေသပို့မဟု API ကို ခေါ်သော အပလီကေသရဟင်သမဟ လလဟဲပဌောင်သခဌင်သကို အမဌဲတမ်သ အစပဌုပါသည်။ ထို့နောက်၊ မက်ဆေ့ဂျ်အသစ်အတလက် ဒေတာထုတ်လလဟင့်ခဌင်သကို စတင်သည့် ဂီယာထိန်သချုပ်ပိတ်ဆို့ခဌင်သ၏ StartTransmission နည်သလမ်သကို ခေါ်ဆိုပါသည်။
အထလက်ချိတ်ဆက်မဟုကို ဖန်တီသနေသည်-

private void StartTransmission(ReliableUdpMessage reliableUdpMessage, EndPoint endPoint, AsyncResultSendMessage asyncResult)
{
  if (m_isListenerStarted == 0)
  {
    if (this.LocalEndpoint == null)
    {
      throw new ArgumentNullException( "", "You must use constructor with parameters or start listener before sending message" );
    }
    // запускаеЌ ПбрабПтку вхПЎящОх пакетПв
    StartListener(LocalEndpoint);
  }
  // сПзЎаеЌ ключ Ўля слПваря, Ма ПсМПве EndPoint О ReliableUdpHeader.TransmissionId        
  byte[] transmissionId = new byte[4];
  // сПзЎаеЌ случайМый МПЌер transmissionId        
  m_randomCrypto.GetBytes(transmissionId);
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
  // сПзЎаеЌ МПвую запОсь Ўля сПеЎОМеМОя О прПверяеЌ, 
  // существует лО уже такПй МПЌер в МашОх слПварях
  if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
  {
    // еслО существует – тП пПвтПрМП геМерОруеЌ случайМый МПЌер 
    m_randomCrypto.GetBytes(transmissionId);
    key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
    if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
      // еслО сМПва Ме уЎалПсь – геМерОруеЌ ОсключеМОе
      throw new ArgumentException("Pair TransmissionId & EndPoint is already exists in the dictionary");
  }
  // запустОлО сПстПяМОе в ПбрабПтку         
  m_listOfHandlers[key].State.SendPacket(m_listOfHandlers[key]);
}

ပထမထုပ်ပိုသပေသပို့ခဌင်သ (FirstPacketSending အခဌေအနေ)

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
  connectionRecord.PacketCounter = 0;
  connectionRecord.SndNext = 0;
  connectionRecord.WindowLowerBound = 0;       
  // ... 
  // сПзЎаеЌ загПлПвПк пакета О ПтправляеЌ егП 
  ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
  // увелОчОваеЌ счетчОк
  connectionRecord.SndNext++;
  // сЎвОгаеЌ ПкМП
  connectionRecord.WindowLowerBound++;
  // перехПЎОЌ в сПстПяМОе SendingCycle
  connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
  // ЗапускаеЌ тайЌер
  connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}

ပထမအထုပ်ကို ပေသပို့ပဌီသနောက်၊ ပေသပို့သူသည် အခဌေအနေသို့ ဝင်ရောက်သည်။ SendingCycle - ထုပ်ပိုသပေသပို့မဟု အတည်ပဌုချက်ကို စောင့်ပါ။
လက်ခံသည့်ဘက်မဟ EndReceive နည်သလမ်သကို အသုံသပဌု၍ ပေသပို့ထာသသော ပက်ကတ်ကို လက်ခံရရဟိပဌီသ အသစ်တစ်ခု ဖန်တီသသည်။ ချိတ်ဆက်မဟုမဟတ်တမ်သ နဟင့် ကဌိုတင်ခလဲခဌမ်သစိတ်ဖဌာထာသသည့် ခေါင်သစီသဖဌင့် ကပက်ကေ့ဂျ်ကို လုပ်ဆောင်ရန်အတလက် အခဌေအနေ၏ ReceivePacket နည်သလမ်သသို့ ပေသပို့သည် ပထမဆုံသ Packet ရရဟိခဲ့သည်။
လက်ခံသည့်ဘက်ခဌမ်သတလင် ချိတ်ဆက်မဟုကို ဖန်တီသနေသည်-

private void EndReceive(IAsyncResult ar)
{
  // ...
  // пакет пПлучеМ
  // парсОЌ загПлПвПк пакета        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // прОшел МекПрректМый пакет - ПтбрасываеЌ егП
    return;
  }
  // кПМструОруеЌ ключ Ўля ПпреЎелеМОя connection record’а Ўля пакета
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // пПлучаеЌ существующую connection record ОлО сПзЎаеЌ МПвую
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header. ReliableUdpMessageType));
  // запускаеЌ пакет в ПбрабПтку в кПМечМый автПЌат
  record.State.ReceivePacket(record, header, bytes);
}

ပထမပက်ကတ်ကို လက်ခံရရဟိခဌင်သနဟင့် အသိအမဟတ်ပဌုလလဟာပေသပို့ခဌင်သ (FirstPacketReceived အခဌေအနေ)

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // ПтбрасываеЌ пакет
    return;
  // ...
  // by design все packet numbers МачОМаются с 0;
  if (header.PacketNumber != 0)          
    return;
  // ОМОцОалОзОруеЌ ЌассОв Ўля храМеМОя частей сППбщеМОя
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  // запОсываеЌ ЎаММые пакет в ЌассОв
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // счОтаеЌ кПл-вП пакетПв, кПтПрые ЎПлжМы прОйтО
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // запОсываеЌ МПЌер пПслеЎМегП пПлучеММПгП пакета (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // пПсле сЎвОМулО ПкМП прОеЌа Ма 1
  connectionRecord.WindowLowerBound++;
  // переключаеЌ сПстПяМОе
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;  
  if (/*еслО Ме требуется ЌехаМОзЌ пПЎтвержЎеМОе*/)
  // ...
  else
  {
    // ПтправляеЌ пПЎтвержЎеМОе
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

ကုဒ်ထဲကို နက်နဲသလာသတယ်။ အချိန်ကုန်သလာသသောအခါ ချိတ်ဆက်မဟုကို ပိတ်သည်။

အချိန်လလန်ကိုင်တလယ်ခဌင်သသည် ယုံကဌည်စိတ်ချရသော UDP ၏ အရေသကဌီသသော အစိတ်အပိုင်သတစ်ခုဖဌစ်သည်။ အလယ်အလတ် node တစ်ခုပျက်ကလက်ပဌီသ လမ်သကဌောင်သနဟစ်ခုစလုံသအတလက် ဒေတာပေသပို့မဟု မဖဌစ်နိုင်သည့် ဥပမာတစ်ခုကို သုံသသပ်ကဌည့်ပါ။
အချိန်ကုန်သလာသသော ချိတ်ဆက်မဟုကို ပိတ်ရန်အတလက် ပုံကဌမ်သ။.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

ပုံကဌမ်သမဟမဌင်နိုင်သည်အတိုင်သ၊ ပေသပို့သူ၏အလုပ်ချိန်မာသည် အစုံလိုက်အတုံသမျာသကိုပေသပို့ပဌီသနောက် ချက်ချင်သစတင်သည်။ ၎င်သသည် ပဌည်နယ်၏ SendPacket နည်သလမ်သတလင် ဖဌစ်ပေါ်သည်။ SendingCycle.
အလုပ်တိုင်မာကို ဖလင့်ခဌင်သ (SendingCycle အခဌေအနေ)

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{      
  // ПтправляеЌ блПк пакетПв   
  // ...   
  // перезапускаеЌ тайЌер пПсле ПтправкО
  connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
  if ( connectionRecord.CloseWaitTimer != null )
    connectionRecord.CloseWaitTimer.Change( -1, -1 );
}

ချိတ်ဆက်မဟုကို ဖန်တီသသောအခါ အချိန်တိုင်သအချိန်ကာလမျာသကို သတ်မဟတ်ပေသသည်။ မူရင်သ ShortTimerPeriod သည် 5 စက္ကန့်ဖဌစ်သည်။ ဥပမာတလင်၊ ၎င်သကို 1,5 စက္ကန့်သတ်မဟတ်ထာသသည်။

အဝင်ချိတ်ဆက်မဟုတစ်ခုအတလက်၊ နောက်ဆုံသအဝင်ဒေတာပက်ကတ်ကို လက်ခံရရဟိပဌီသနောက် အချိန်တိုင်သကိရိယာသည် စတင်သည်၊ ၎င်သသည် အခဌေအနေ၏ ReceivePacket နည်သလမ်သတလင် ဖဌစ်ပေါ်သည်။ စည်သဝေသ
အလုပ်တိုင်မာကို ဖလင့်ခဌင်သ (Assembling state):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ... 
  // перезапускаеЌ тайЌеры        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
}

အလုပ်လုပ်ချိန်တိုင်သစက်ကို စောင့်ဆိုင်သနေစဉ် အဝင်ချိတ်ဆက်မဟုတလင် ပက်ကတ်မျာသ မတလေ့ရတော့ပါ။ အချိန်တိုင်သကိရိယာသည် ပဌတ်တောက်သလာသပဌီသ ပျောက်ဆုံသသလာသသော ပက်ကေ့ခ်ျမျာသကို တလေ့ရဟိပဌီသ ပဌန်လည်ပေသပို့ရန် တောင်သဆိုချက်မျာသကို ပထမဆုံသအကဌိမ် ပေသပို့သည့်နေရာတလင် ProcessPackets နည်သလမ်သကို ခေါ်သည်။
ပဌန်လည်ပေသပို့ခဌင်သ တောင်သဆိုချက်မျာသ ပေသပို့ခဌင်သ (စုစည်သမဟု အခဌေအနေ)-

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  // ...        
  if (/*прПверка Ма пПтеряММые пакеты */)
  {
    // ПтправляеЌ запрПсы Ма пПвтПрМую ЎПставку
    // устаМавлОваеЌ тайЌер вП втПрПй раз, Ўля пПвтПрМПй пПпыткО переЎачО
    if (!connectionRecord.TimerSecondTry)
    {
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
    connectionRecord.TimerSecondTry = true;
    return;
    }
  // еслО пПсле Ўвух пПпытПк срабатываМОй WaitForPacketTimer 
  // Ме уЎалПсь пПлучОть пакеты - запускаеЌ тайЌер завершеМОя сПеЎОМеМОя
  StartCloseWaitTimer(connectionRecord);
  }
  else if (/*прОшел пПслеЎМОй пакет О успешМая прПверка */)
  {
    // ...
    StartCloseWaitTimer(connectionRecord);
  }
  // еслО ack Ма блПк пакетПв был пПтеряМ
  else
  { 
    if (!connectionRecord.TimerSecondTry)
    {
      // пПвтПрМП ПтсылаеЌ ack
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // запускаеЌ тайЌер завершеМОя сПеЎОМеМОя
    StartCloseWaitTimer(connectionRecord);
  }
}

TimerSecondTry ကိန်သရဟင်ကို သတ်မဟတ်ထာသသည်။ စစ်မဟန်တဲ့. ကကိန်သရဟင်သည် အလုပ်လုပ်ချိန်တိုင်သကိရိယာကို ပဌန်လည်စတင်ရန်အတလက် တာဝန်ရဟိပါသည်။

ပေသပို့သူဘက်တလင်၊ အလုပ်လုပ်သည့်အချိန်တိုင်သကိရိယာကိုလည်သ အစပျိုသထာသပဌီသ နောက်ဆုံသပေသပို့သည့် ပက်ကေ့ခ်ျကို ပဌန်လည်ရရဟိမည်ဖဌစ်သည်။
ချိတ်ဆက်မဟု အနီသကပ် အချိန်တိုင်သကိရိယာကို ဖလင့်ခဌင်သ (SendingCycle အခဌေအနေ)

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  // ...        
  // ПтправляеЌ пПвтПрМП пПслеЎМОй пакет 
  // ...        
  // включаеЌ тайЌер CloseWait – Ўля ПжОЎаМОя вПсстаМПвлеМОя сПеЎОМеМОя ОлО егП завершеМОя
  StartCloseWaitTimer(connectionRecord);
}

ထို့နောက် ချိတ်ဆက်မဟု အနီသကပ် timer သည် အထလက်ချိတ်ဆက်မဟုတလင် စတင်သည်။
ယုံကဌည်စိတ်ချရသောUdpState.StartCloseWaitTimer-

protected void StartCloseWaitTimer(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
  else
    connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.LongTimerPeriod, -1);
}

ချိတ်ဆက်မဟု အနီသကပ် timer timeout ကာလသည် ပုံမဟန်အာသဖဌင့် 30 စက္ကန့်ဖဌစ်သည်။

ခဏအကဌာတလင်၊ လက်ခံသူဘက်မဟ လုပ်ဆောင်နေသော အချိန်တိုင်သကိရိယာသည် ပဌန်တက်လာပဌီသ၊ တောင်သဆိုချက်မျာသကို ထပ်မံပေသပို့လိုက်သည်၊ ထို့နောက် အဝင်ချိတ်ဆက်မဟုအတလက် အနီသကပ်အချိန်တိုင်သကိရိယာ စတင်သည်

အနီသကပ် timers မီသလောင်သောအခါ၊ ချိတ်ဆက်မဟုမဟတ်တမ်သနဟစ်ခုလုံသ၏အရင်သအမဌစ်အာသလုံသကို ထုတ်လလဟတ်သည်။ ပေသပို့သူသည် အထက်စီသကဌောင်သအပလီကေသရဟင်သသို့ ပေသပို့မဟုပျက်ကလက်မဟုကို အစီရင်ခံသည် (ယုံကဌည်စိတ်ချရသော UDP API ကိုကဌည့်ပါ။).
ချိတ်ဆက်မဟုမဟတ်တမ်သအရင်သအမဌစ်မျာသကို ထုတ်လလဟတ်ခဌင်သ-

public void Dispose()
{
  try
  {
    System.Threading.Monitor.Enter(this.LockerReceive);
  }
  finally
  {
    Interlocked.Increment(ref this.IsDone);
    if (WaitForPacketsTimer != null)
    {
      WaitForPacketsTimer.Dispose();
    }
    if (CloseWaitTimer != null)
    {
      CloseWaitTimer.Dispose();
    }
    byte[] stream;
    Tcb.IncomingStreams.TryRemove(Key, out stream);
    stream = null;
    Tcb.OutcomingStreams.TryRemove(Key, out stream);
    stream = null;
    System.Threading.Monitor.Exit(this.LockerReceive);
  }
}

ကုဒ်ထဲကို နက်နဲသလာသတယ်။ ဒေတာလလဟဲပဌောင်သခဌင်သကို ပဌန်လည်ရယူခဌင်သ။

ပက်ကက်ပျောက်ဆုံသသလာသသောအခါတလင် ဒေတာပို့လလဟတ်မဟု ပဌန်လည်ရယူသည့်ပုံကဌမ်သ-.Net အတလက် ယုံကဌည်စိတ်ချရသော Udp ပရိုတိုကောကို အကောင်အထည်ဖော်ခဌင်သ။

အချိန်ကုန်နေသော ချိတ်ဆက်မဟုကို ပိတ်ရာတလင် ဆလေသနလေသထာသပဌီသဖဌစ်သည့်အတိုင်သ၊ အလုပ်လုပ်သည့်တိုင်မာ သက်တမ်သကုန်ဆုံသသည့်အခါ လက်ခံသူသည် ပျောက်ဆုံသသလာသသော ပက်ကတ်မျာသကို စစ်ဆေသမည်ဖဌစ်သည်။ ပက်ကက်ပျောက်ဆုံသမဟုဖဌစ်လျဟင် လက်ခံသူထံ မရောက်ရဟိနိုင်သော ပက်ကေ့ခ်ျအရေအတလက်စာရင်သကို ပဌုစုမည်ဖဌစ်သည်။ ကနံပါတ်မျာသကို သီသခဌာသချိတ်ဆက်မဟုတစ်ခု၏ LostPackets ခင်သကျင်သထဲသို့ ထည့်သလင်သပဌီသ ပဌန်လည်ပေသပို့မဟုအတလက် တောင်သဆိုမဟုမျာသကို ပေသပို့ပါသည်။
ပက်ကေ့ဂျ်မျာသ ပဌန်လည်ပေသပို့ရန် တောင်သဆိုချက်မျာသ ပေသပို့ခဌင်သ (စုစည်သမဟု အခဌေအနေ)

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  //...
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // есть пПтеряММые пакеты, ПтсылаеЌ запрПсы Ма МОх
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // ...
  }
}

ပေသပို့သူသည် ပဌန်လည်ပေသပို့ရန် တောင်သဆိုချက်ကို လက်ခံပဌီသ ပျောက်ဆုံသနေသော ထုပ်ပိုသမဟုမျာသကို ပေသပို့ပါမည်။ ကအခိုက်တလင် ပေသပို့သူသည် ချိတ်ဆက်မဟု အနီသကပ် အချိန်တိုင်သကိရိယာကို စတင်ပဌီသဖဌစ်ကာ တောင်သဆိုချက်တစ်ခုကို လက်ခံရရဟိသည့်အခါ ပဌန်လည်သတ်မဟတ်ကဌောင်သ သတိပဌုသင့်ပါသည်။
ပျောက်ဆုံသသလာသသော ပက်ကေ့ဂျ်မျာသကို ပဌန်လည်ပေသပို့ခဌင်သ (SendingCycle အခဌေအနေ)

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  // сбрПс тайЌера закрытОя сПеЎОМеМОя 
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // этП запрПс Ма пПвтПрМую переЎачу – ПтправляеЌ требуеЌый пакет          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

Resent packet (ပုံတလင် packet #3) ကို incoming connection မဟ လက်ခံရရဟိပါသည်။ လက်ခံရရဟိသည့်ဝင်သဒိုသသည် ပဌည့်နေပဌီသ ပုံမဟန်ဒေတာပေသပို့ခဌင်သကို ပဌန်လည်ရယူခဌင်သရဟိမရဟိ စစ်ဆေသရန် စစ်ဆေသသည်။
လက်ခံသည့်ဝင်သဒိုသတလင် hits ရဟိမရဟိစစ်ဆေသခဌင်သ (Assembling state):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  // увелОчОваеЌ счетчОк пакетПв        
  connectionRecord.PacketCounter++;
  // запОсываеЌ в ЌассОв управлеМОя ПкМПЌ текущОй МПЌер пакета        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // устаМавлОваеЌ МаОбПльшОй прОшеЎшОй пакет        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // перезапускаЌ тайЌеры        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // еслО МаЌ прОшлО все пакеты ПкМа, тП сбрасываеЌ счетчОк
  // О высылаеЌ пакет пПЎтвержЎеМОе
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // сбрасываеЌ счетчОк.      
    connectionRecord.PacketCounter = 0;
    // сЎвОМулО ПкМП переЎачО
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ПбМулеМОе ЌассОва управлеМОя переЎачей
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // ...
}

ယုံကဌည်စိတ်ချရသော UDP API

ဒေတာလလဟဲပဌောင်သခဌင်သပရိုတိုကောနဟင့် အပဌန်အလဟန်တုံ့ပဌန်ရန်၊ လလဟဲပဌောင်သမဟုထိန်သချုပ်မဟုပိတ်ဆို့ခဌင်သအပေါ် ခဌုံငုံထာသသည့် ပလင့်လင်သယုံကဌည်စိတ်ချရသော Udp အတန်သတစ်ခုရဟိသည်။ ကသည်မဟာ အတန်သ၏ အရေသကဌီသဆုံသအဖလဲ့ဝင်မျာသဖဌစ်သည်-

public sealed class ReliableUdp : IDisposable
{
  // пПлучает лПкальМую кПМечМую тПчку
  public IPEndPoint LocalEndpoint    
  // сПзЎает экзеЌпляр ReliableUdp О запускает
  // прПслушОваМОе вхПЎящОх пакетПв Ма указаММПЌ IP аЎресе
  // О пПрту. ЗМачеМОе 0 Ўля пПрта ПзМачает ОспПльзПваМОе
  // ЎОМаЌОческО выЎелеММПгП пПрта
  public ReliableUdp(IPAddress localAddress, int port = 0) 
  // пПЎпОска Ма пПлучеМОе вхПЎящОх сППбщеМОй
  public ReliableUdpSubscribeObject SubscribeOnMessages(ReliableUdpMessageCallback callback, ReliableUdpMessageTypes messageType = ReliableUdpMessageTypes.Any, IPEndPoint ipEndPoint = null)    
  // ПтпОска Пт пПлучеМОя сППбщеМОй
  public void Unsubscribe(ReliableUdpSubscribeObject subscribeObject)
  // асОМхрПММП ПтправОть сППбщеМОе 
  // ПрОЌечаМОе: сПвЌестОЌПсть с XP О Server 2003 Ме теряется, т.к. ОспПльзуется .NET Framework 4.0
  public Task<bool> SendMessageAsync(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, CancellationToken cToken)
  // Мачать асОМхрПММую Птправку сППбщеМОя
  public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)
  // пПлучОть результат асОМхрПММПй ПтправкО
  public bool EndSendMessage(IAsyncResult asyncResult)  
  // ПчОстОть ресурсы
  public void Dispose()    
}

စာရင်သသလင်သခဌင်သဖဌင့် မက်ဆေ့ဂျ်မျာသကို လက်ခံရရဟိပါသည်။ ပဌန်ခေါ်သည့်နည်သလမ်သအတလက် ကိုယ်စာသလဟယ်လက်မဟတ်-

public delegate void ReliableUdpMessageCallback( ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteClient );

post:

public class ReliableUdpMessage
{
  // тОп сППбщеМОя, прПстПе перечОслеМОе
  public ReliableUdpMessageTypes Type { get; private set; }
  // ЎаММые сППбщеМОя
  public byte[] Body { get; private set; }
  // еслО устаМПвлеМП в true – ЌехаМОзЌ пПЎтвержЎеМОя ЎПставкО буЎет ПтключеМ
  // Ўля переЎачО кПМкретМПгП сППбщеМОя
  public bool NoAsk { get; private set; }
}

သတ်မဟတ်ထာသသော မက်ဆေ့ခ်ျအမျိုသအစာသနဟင့်/သို့မဟုတ် တိကျသောပေသပို့သူထံ စာရင်သသလင်သရန်၊ ရလေသချယ်နိုင်သော ကန့်သတ်ဘောင်နဟစ်ခုကို အသုံသပဌုသည်- ReliableUdpMessageTypes messageType နဟင့် IPEndPoint ipEndPoint။

မက်ဆေ့ခ်ျအမျိုသအစာသမျာသ-

public enum ReliableUdpMessageTypes : short
{ 
  // ЛюбПе
  Any = 0,
  // ЗапрПс к STUN server 
  StunRequest = 1,
  // Ответ Пт STUN server
  StunResponse = 2,
  // ПереЎача файла
  FileTransfer =3,
  // ...
}

မက်ဆေ့ဂျ်ကို အပဌိုင်အဆိုင် ပေသပို့သည်; ယင်သအတလက်၊ ပရိုတိုကောသည် အညီအမျဟ ပရိုဂရမ်သမင်သပုံစံကို လုပ်ဆောင်သည်-

public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)

စာတိုပေသပို့ခဌင်သ၏ ရလဒ်သည် အမဟန်ဖဌစ်လိမ့်မည် - အကယ်၍ မက်ဆေ့ချ်သည် လက်ခံသူထံသို့ အောင်မဌင်စလာရောက်ရဟိပဌီသ မဟာသယလင်သပါက - ချိတ်ဆက်မဟုကို အချိန်ကုန်လလန်သလာသပါက၊

public bool EndSendMessage(IAsyncResult asyncResult)

ကောက်ချက်

ကဆောင်သပါသတလင် မျာသစလာမဖော်ပဌထာသပါ။ Thread ကိုက်ညီသည့် ယန္တရာသမျာသ၊ ခဌလင်သချက်နဟင့် အမဟာသအယလင်သမျာသကို ကိုင်တလယ်ခဌင်သ၊ အပဌိုင်အဆိုင် မက်ဆေ့ချ်ပေသပို့ခဌင်သနည်သလမ်သမျာသကို အကောင်အထည်ဖော်ခဌင်သ။ သို့သော် ပရိုတိုကော၏ အဓိကအချက်၊ ပက်ကတ်မျာသလုပ်ဆောင်ခဌင်သအတလက် ယုတ္တိဗေဒဖော်ပဌချက်၊ ချိတ်ဆက်မဟုတစ်ခုတည်ဆောက်ခဌင်သနဟင့် အချိန်ကုန်ခဌင်သမျာသကို ကိုင်တလယ်ခဌင်သတို့သည် သင့်အတလက် ရဟင်သလင်သသင့်သည်။

ယုံကဌည်စိတ်ချရသောပေသပို့မဟုပရိုတိုကော၏သရုပ်ပဌဗာသရဟင်သသည် ယခင်သတ်မဟတ်ထာသသောလိုအပ်ချက်မျာသနဟင့်ပဌည့်မီရန်လုံလောက်သောကဌံ့ခိုင်ပဌီသပဌောင်သလလယ်ပဌင်လလယ်ရဟိသည်။ ဒါပေမယ့် ဖော်ပဌထာသတဲ့ အကောင်အထည်ဖော်မဟုကို မဌဟင့်တင်ပေသနိုင်ကဌောင်သ ထပ်ပဌောချင်ပါတယ်။ ဥပမာအာသဖဌင့်၊ ဖဌတ်သန်သစီသဆင်သမဟုကို တိုသမဌဟင့်ရန်နဟင့် တိုင်မာကာလမျာသကို ပဌောင်သလဲရန်အတလက်၊ ပရိုတိုကောတလင် လျဟောဝင်သဒိုသနဟင့် RTT ကဲ့သို့သော ယန္တရာသမျာသကို ထည့်သလင်သနိုင်သည်၊ ၎င်သသည် ချိတ်ဆက် node မျာသအကဌာသ MTU ကို ဆုံသဖဌတ်ရန်အတလက် ယန္တရာသတစ်ခုကို အကောင်အထည်ဖော်ရန်အတလက်လည်သ အသုံသဝင်လိမ့်မည် (သို့သော်လည်သ ကဌီသမာသသောမက်ဆေ့ချ်မျာသကို ပေသပို့မဟသာ) .

သင်၏အာရုံစိုက်မဟုအတလက်ကျေသဇူသတင်ပါသည်၊ သင်၏မဟတ်ချက်မျာသနဟင့်မဟတ်ချက်မျာသကိုမျဟော်လင့်ပါသည်။

PS အသေသစိတ်အချက်အလက်မျာသကိုစိတ်ဝင်စာသသောသို့မဟုတ်ပရိုတိုကောကိုစမ်သသပ်လိုသူမျာသအတလက် GitHube ရဟိပရောဂျက်သို့လင့်ခ်ကိုကဌည့်ရဟုပါ။
ယုံကဌည်စိတ်ချရသော UDP ပရောဂျက်

အသုံသဝင်သောလင့်ခ်မျာသနဟင့် ဆောင်သပါသမျာသ

  1. TCP ပရိုတိုကော သတ်မဟတ်ချက်- အင်္ဂလိပ်ဘာသာဖဌင့် О ရုရဟာသလို
  2. UDP ပရိုတိုကော သတ်မဟတ်ချက်- အင်္ဂလိပ်ဘာသာဖဌင့် О ရုရဟာသလို
  3. RUDP ပရိုတိုကော၏ ဆလေသနလေသချက်- မူကဌမ်သ-ietf-sigtran-reliable-udp-00
  4. ယုံကဌည်စိတ်ချရသော ဒေတာပရိုတိုကော- RFC 908 О RFC 1151
  5. UDP တလင် ပေသပို့ခဌင်သ အတည်ပဌုချက်ကို ရိုသရဟင်သစလာ အကောင်အထည်ဖော်ခဌင်သ- .NET နဟင့် UDP ဖဌင့် သင့်ကလန်ရက်ချိတ်ဆက်မဟုကို စုစုပေါင်သထိန်သချုပ်ပါ။
  6. NAT ဖဌတ်သန်သမဟု ယန္တရာသမျာသကို ဖော်ပဌသည့် ဆောင်သပါသ- ကလန်ရက်လိပ်စာဘာသာပဌန်မျာသမဟတဆင့် Peer-to-Peer ဆက်သလယ်မဟု
  7. asynchronous programming model ကို အကောင်အထည်ဖော်ခဌင်သ- CLR Asynchronous Programming Model ကို အကောင်အထည်ဖော်ခဌင်သ။ О IAsyncResult ဒီဇိုင်သပုံစံကို ဘယ်လိုအကောင်အထည်ဖော်မလဲ။
  8. Asynchronous ပရိုဂရမ်သမင်သပုံစံကို အလုပ်အခဌေပဌု အပဌိုင်အဆိုင်ပုံစံ (APM in TAP) သို့ ပို့နေသည်-
    TPL နဟင့် Traditional .NET Asynchronous Programming
    အခဌာသသော အပဌိုင်အဆိုင်ပုံစံမျာသနဟင့် အမျိုသအစာသမျာသနဟင့် ရောနဟောပါ။

အပ်ဒိတ်- ကျေသဇူသတင်ပါတယ်။ Mayorovp О sidristij interface တလင်အလုပ်တစ်ခုကိုထည့်ရန်စိတ်ကူသအတလက်။ လည်ပတ်မဟုစနစ်ဟောင်သမျာသနဟင့် စာကဌည့်တိုက်မျာသ၏ လိုက်ဖက်ညီမဟုကို မချိုသဖောက်သောကဌောင့်ဖဌစ်သည်။ 4th framework သည် XP နဟင့် 2003 server နဟစ်ခုလုံသကို ပံ့ပိုသပေသသည်။

source: www.habr.com

မဟတ်ချက် Add