Cheerp၊ WebRTC နဟင့် Firebase တို့ဖဌင့် C++ မဟ အမျာသအပဌာသကစာသနိုင်သောဂိမ်သတစ်ခုကို ဝဘ်သို့ သယ်ဆောင်ခဌင်သ။

နိဒါန်သ

ကျလန်တော်တို့ရဲ့ကုမ္ပဏီ ယိမ်သသောနည်သပညာမျာသ သမာသရိုသကျ desktop အက်ပ်လီကေသရဟင်သမျာသကို ဝဘ်သို့ သယ်ဆောင်ခဌင်သအတလက် ဖဌေရဟင်သချက်ပေသသည်။ ကျလန်ုပ်တို့၏ C++ compiler ရလဟင် နဟစ်ခုလုံသကိုထောက်ပံ့ပေသသော WebAssembly နဟင့် JavaScript ပေါင်သစပ်မဟုကိုထုတ်ပေသသည်။ ရိုသရဟင်သသောဘရောက်ဆာအပဌန်အလဟန်, နဟင့်မဌင့်မာသသောစလမ်သဆောင်ရည်။

၎င်သ၏အပလီကေသရဟင်သ၏ဥပမာတစ်ခုအနေဖဌင့်၊ ကျလန်ုပ်တို့သည် မျာသစလာသောကစာသသူဂိမ်သတစ်ခုကို ဝဘ်သို့တင်ရန် ဆုံသဖဌတ်ပဌီသ ရလေသချယ်ခဲ့သည်။ Teeworlds. Teeworlds သည် သေသငယ်သော်လည်သ တက်ကဌလသောကစာသသမာသမျာသ (ကျလန်ုပ်အပါအဝင်) ပါဝင်သော multiplayer XNUMXD retro ဂိမ်သတစ်ခုဖဌစ်သည်။ ၎င်သသည် ဒေါင်သလုဒ်လုပ်ထာသသော အရင်သအမဌစ်မျာသနဟင့် CPU နဟင့် GPU လိုအပ်ချက်မျာသအတလက် သေသငယ်သည် - စံပဌကိုယ်စာသလဟယ်တစ်ညသဖဌစ်သည်။

Cheerp၊ WebRTC နဟင့် Firebase တို့ဖဌင့် C++ မဟ အမျာသအပဌာသကစာသနိုင်သောဂိမ်သတစ်ခုကို ဝဘ်သို့ သယ်ဆောင်ခဌင်သ။
Teeworlds ဘရောက်ဆာတလင် လုပ်ဆောင်နေသည်။

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

  • XMLHttpRequest/fetchကလန်ရက်အပိုင်သတလင် HTTP တောင်သဆိုမဟုမျာသသာ ပါဝင်နေပါက သို့မဟုတ်
  • WebSockets မျာသ.

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

တတိယနည်သလမ်သရဟိပါသည် - ဘရောက်ဆာမဟကလန်ရက်ကိုအသုံသပဌုပါ။ WebRTC.

RTCDataChannel ၎င်သသည် ယုံကဌည်စိတ်ချရသော နဟင့် ယုံကဌည်စိတ်ချရသော ထုတ်လလဟင့်မဟု နဟစ်မျိုသလုံသကို ပံ့ပိုသပေသသည် (နောက်ဆုံသအခဌေအနေတလင် UDP ကို ​​သယ်ယူပို့ဆောင်ရေသပရိုတိုကောအဖဌစ် ဖဌစ်နိုင်သည့်အခါတိုင်သ အသုံသပဌုရန်ကဌိုသစာသသည်) နဟင့် အဝေသထိန်သဆာဗာနဟင့် ဘရောက်ဆာမျာသကဌာသတလင် နဟစ်မျိုသလုံသအသုံသပဌုနိုင်ပါသည်။ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် ဆာဗာအစိတ်အပိုင်သအပါအဝင် အပလီကေသရဟင်သတစ်ခုလုံသကို ဘရောက်ဆာသို့ ပို့နိုင်သည်ဟု ဆိုလိုသည်။

သို့သော်၊ ၎င်သသည် နောက်ထပ်အခက်အခဲတစ်ခုနဟင့် လာပါသည်- WebRTC ရလယ်တူနဟစ်ညသ ဆက်သလယ်မဟုမပဌုမီ၊ ၎င်သတို့သည် ချိတ်ဆက်ရန် အတော်လေသ ရဟုပ်ထလေသသော လက်ဆလဲနဟုတ်ဆက်မဟုတစ်ခု လုပ်ဆောင်ရန် လိုအပ်ပဌီသ ပဌင်ပအဖလဲ့အစည်သမျာသစလာ (အချက်ပဌခဌင်သ ဆာဗာတစ်ခုနဟင့် တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော ဆာဗာမျာသ လိုအပ်ပါသည်။ STUN/လည်ပတ်).

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

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

အနည်သဆုံသ WebRTC

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

လုပ်ဖော်ကိုင်ဖက်မျာသအကဌာသ ချိတ်ဆက်မဟုကို ICE ဟုခေါ်သော ယန္တရာသတစ်ခုမဟတစ်ဆင့် STUN နဟင့်/သို့မဟုတ် လဟည့်သည့်ဆာဗာမျာသကို အသုံသပဌု၍ (တစ်ဖက်တလင် NAT ရဟိလျဟင်ပင်) (နဟစ်ဖက်စလုံသတလင် NAT ရဟိလျဟင်ပင်) တည်ဆောက်ထာသသည်။ ရလယ်တူမျာသသည် SDP ပရိုတိုကော၏ ကမ်သလဟမ်သချက်နဟင့် အဖဌေမဟတစ်ဆင့် ICE အချက်အလက်နဟင့် ချန်နယ်ဘောင်မျာသကို ဖလဟယ်ကဌသည်။

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

  • NAT အတလက် Session Traversal Utilities (STUN) - NAT ကိုကျော်ဖဌတ်ကာ host နဟင့် data တိုက်ရိုက်ဖလဟယ်ရန်အတလက်အတလဲ (IP၊ port) ရယူခဌင်သအတလက် protocol တစ်ခု။ မိမိတာဝန်ကို ပဌီသမဌောက်အောင် စီမံနိုင်လျဟင် ရလယ်တူမျာသသည် အချင်သချင်သ လလတ်လပ်စလာ ဒေတာဖလဟယ်နိုင်သည်။
  • NAT အနီသတဝိုက်ရဟိ Relay မျာသကို အသုံသပဌု၍ ဖဌတ်သန်သခဌင်သ။ (လည်ပတ်) NAT traversal အတလက်လည်သ အသုံသပဌုသည် ၊ သို့သော် ရလယ်တူ နဟစ်ညသစလုံသ မဌင်နိုင်သော proxy မဟတဆင့် ဒေတာ ပေသပို့ခဌင်သဖဌင့် ၎င်သကို အကောင်အထည် ဖော်ပါသည်။ ၎င်သသည် latency ကိုထပ်လောင်သပဌီသ STUN ထက်အကောင်အထည်ဖော်ရန် ပို၍စျေသကဌီသသည် (၎င်သကိုဆက်သလယ်ရေသစက်ရဟင်တစ်ခုလုံသတလင်အသုံသပဌုထာသသောကဌောင့်)၊ သို့သော် တစ်ခါတစ်ရံတလင်၎င်သသည်တစ်ခုတည်သသောရလေသချယ်မဟုဖဌစ်သည်။
  • အပဌန်အလဟန် ဆက်သလယ်ချိတ်ဆက်မဟု တည်ထောင်ခဌင်သ။ (ICE) သက်တူရလယ်တူနဟစ်ညသကို တိုက်ရိုက်ချိတ်ဆက်ခဌင်သမဟရရဟိသော အချက်အလက်မျာသအပဌင် STUN နဟင့် TURN ဆာဗာမျာသ၏ မည်သည့်နံပါတ်မဟရရဟိသော အချက်အလက်မျာသအပေါ် အခဌေခံ၍ ရလယ်တူနဟစ်ညသကို ချိတ်ဆက်ရန် အကောင်သဆုံသဖဌစ်နိုင်ချေနည်သလမ်သကို ရလေသချယ်ရန် အသုံသပဌုသည်။
  • Session ဖော်ပဌချက် Protocol (SDP) ချိတ်ဆက်မဟုချန်နယ် ကန့်သတ်ဘောင်မျာသကို ဖော်ပဌသည့် ဖော်မတ်တစ်ခု၊ ဥပမာ၊ ICE ကိုယ်စာသလဟယ်လောင်သမျာသ၊ မာလ်တီမီဒီယာ ကုဒ်ဒစ်မျာသ (အော်ဒီယို/ဗီဒီယိုချန်နယ်တစ်ခုအတလက်) စသည်တို့... ရလယ်တူမျာသထဲမဟ တစ်ညသသည် SDP ကမ်သလဟမ်သချက်ကို ပေသပို့ပဌီသ ဒုတိယသည် SDP အဖဌေတစ်ခုဖဌင့် တုံ့ပဌန်ပါသည်။ . ယင်သနောက်တလင် ချန်နယ်တစ်ခုကို ဖန်တီသထာသသည်။

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

ပဌဿနာမဟာ ၎င်သတို့တလင် တိုက်ရိုက်ဆက်သလယ်နိုင်သည့် စလမ်သရည်မရဟိသေသသောကဌောင့် ကဒေတာကို လဲလဟယ်ရန်အတလက် ပဌင်ပယန္တရာသတစ်ခု ရဟိရပါမည်- အချက်ပဌဆာဗာတစ်ခု။

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

Cheerp၊ WebRTC နဟင့် Firebase တို့ဖဌင့် C++ မဟ အမျာသအပဌာသကစာသနိုင်သောဂိမ်သတစ်ခုကို ဝဘ်သို့ သယ်ဆောင်ခဌင်သ။
ရိုသရဟင်သသော WebRTC လက်ဆလဲနဟုတ်ဆက်ခဌင်သ အစီအစဉ်ဇယာသ

Teeworlds ကလန်ရက် မော်ဒယ် ခဌုံငုံသုံသသပ်ချက်

Teeworlds ကလန်ရက်တည်ဆောက်ပုံသည် အလလန်ရိုသရဟင်သပါသည်။

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

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

ဆာဗာမျာသကို ဖယ်ရဟာသလိုက်ပါ။

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

သို့သော်၊ စနစ်အလုပ်လုပ်ရန်အတလက်၊ ကျလန်ုပ်တို့သည် ပဌင်ပဗိသုကာကို အသုံသပဌုရန် လိုအပ်ပါသေသသည်။

  • တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော STUN ဆာဗာမျာသ- ကျလန်ုပ်တို့တလင် ရလေသချယ်ရန် အခမဲ့ရလေသချယ်စရာမျာသစလာရဟိသည်။
  • အနည်သဆုံသ TURN ဆာဗာတစ်ခု- ကနေရာတလင် အခမဲ့ရလေသချယ်စရာမျာသ မရဟိတော့သောကဌောင့် ကျလန်ုပ်တို့၏ကိုယ်ပိုင် စနစ်ထည့်သလင်သခဌင်သ သို့မဟုတ် ဝန်ဆောင်မဟုအတလက် ပေသချေနိုင်ပါသည်။ ကံကောင်သထောက်မစလာ၊ အချိန်အမျာသစုတလင် ချိတ်ဆက်မဟုကို STUN ဆာဗာမျာသမဟတစ်ဆင့် တည်ဆောက်နိုင်သည် (အမဟန်တကယ် p2p) ကို ပေသစလမ်သနိုင်သော်လည်သ လဟည့်ရန် ရလေသချယ်မဟုတစ်ခုအနေဖဌင့် လိုအပ်ပါသည်။
  • အချက်ပဌခဌင်သဆာဗာ- အခဌာသရဟုထောင့်နဟစ်ခုနဟင့်မတူဘဲ အချက်ပဌခဌင်သကို စံသတ်မဟတ်ထာသခဌင်သမရဟိပါ။ အချက်ပဌခဌင်သဆာဗာသည် အမဟန်တကယ် တာဝန်ယူရမည့်အရာသည် အပလီကေသရဟင်သပေါ်တလင် အနည်သငယ်မူတည်ပါသည်။ ကျလန်ုပ်တို့၏ကိစ္စတလင်၊ ချိတ်ဆက်မဟုတစ်ခုမထူထောင်မီ၊ ဒေတာပမာဏအနည်သငယ်ကို လဲလဟယ်ရန် လိုအပ်ပါသည်။
  • Teeworlds Master ဆာဗာ- ၎င်သတို့၏ တည်ရဟိမဟုကို ကဌော်ငဌာရန်နဟင့် အမျာသသူငဟာ ဆာဗာမျာသကို ရဟာဖလေရန် ဖောက်သည်မျာသက ၎င်သကို အခဌာသဆာဗာမျာသက အသုံသပဌုသည်။ ၎င်သသည် မလိုအပ်သော်လည်သ (ဖောက်သည်မျာသသည် ၎င်သတို့သိသည့် ဆာဗာသို့ အမဌဲတမ်သ ချိတ်ဆက်နိုင်သည်)၊ သို့မဟသာ ကစာသသမာသမျာသသည် ကျပန်သလူမျာသဖဌင့် ဂိမ်သမျာသတလင် ပါဝင်နိုင်စေရန် ထာသရဟိခဌင်သသည် ကောင်သပါတယ်။

ကျလန်ုပ်တို့သည် Google ၏ အခမဲ့ STUN ဆာဗာမျာသကို အသုံသပဌုရန် ဆုံသဖဌတ်ခဲ့ပဌီသ TURN ဆာဗာတစ်ခုကို ကိုယ်တိုင်အသုံသချခဲ့သည်။

နောက်ဆုံသ အချက်နဟစ်ချက်ကို ကျလန်တော်တို့ အသုံသပဌုခဲ့ပါတယ်။ Firebase:

  • Teeworlds မာစတာဆာဗာကို အသုံသပဌုနေသည့် ဆာဗာတစ်ခုစီ၏ အချက်အလက် (အမည်၊ IP၊ မဌေပုံ၊ မုဒ်၊ ...) ပါရဟိသော အရာမျာသစာရင်သတစ်ခုအနေဖဌင့် အလလန်ရိုသရဟင်သပါသည်။ ဆာဗာမျာသသည် ၎င်သတို့၏ကိုယ်ပိုင်အရာဝတ္တုကို ထုတ်ဝေပဌီသ အပ်ဒိတ်လုပ်ကဌပဌီသ ဖောက်သည်မျာသသည် စာရင်သတစ်ခုလုံသကိုယူကာ ပလေယာသို့ပဌသသည်။ ကျလန်ုပ်တို့သည် ပင်မစာမျက်နဟာတလင် စာရင်သကို HTML အဖဌစ်ပဌသထာသသောကဌောင့် ကစာသသမာသမျာသသည် ဆာဗာပေါ်တလင် ကလစ်နဟိပ်ပဌီသ ဂိမ်သဆီသို့ တိုက်ရိုက်ခေါ်ဆောင်သလာသနိုင်သည်။
  • အချက်ပဌခဌင်သသည် ကျလန်ုပ်တို့၏ sockets အကောင်အထည်ဖော်မဟုနဟင့် နီသကပ်စလာဆက်စပ်နေပဌီသ နောက်အပိုင်သတလင်ဖော်ပဌထာသသည်။

Cheerp၊ WebRTC နဟင့် Firebase တို့ဖဌင့် C++ မဟ အမျာသအပဌာသကစာသနိုင်သောဂိမ်သတစ်ခုကို ဝဘ်သို့ သယ်ဆောင်ခဌင်သ။
ဂိမ်သအတလင်သနဟင့် ပင်မစာမျက်နဟာရဟိ ဆာဗာမျာသစာရင်သ

socket မျာသအကောင်အထည်ဖော်ခဌင်သ။

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

ကလန်ရက်ပေါ်တလင် အရိုသရဟင်သဆုံသ ဒေတာဖလဟယ်မဟုအတလက် လိုအပ်သော အနိမ့်ဆုံသကိုလည်သ အကောင်အထည်ဖော်လိုပါသည်။

ဥပမာအာသဖဌင့်၊ ကျလန်ုပ်တို့သည် မဟန်ကန်သောလမ်သကဌောင်သကို မလိုအပ်ပါ- ရလယ်တူအာသလုံသသည် Firebase ဒေတာဘေ့စ်စံနမူနာတစ်ခုနဟင့် ဆက်စပ်နေသော တူညီသော "virtual LAN" ပေါ်တလင် ရဟိနေပါသည်။

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

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

// Create and destroy a socket
int socket();
int close(int fd);
// Bind a socket to a port, and publish it on Firebase
int bind(int fd, AddrInfo* addr);
// Send a packet. This lazily create a WebRTC connection to the 
// peer when necessary
int sendto(int fd, uint8_t* buf, int len, const AddrInfo* addr);
// Receive the packets destined to this socket
int recvfrom(int fd, uint8_t* buf, int len, AddrInfo* addr);
// Be notified when new packets arrived
int recvCallback(Callback cb);
// Obtain a local ip address for this peer key
uint32_t resolve(client::String* key);
// Get the peer key for this ip
String* reverseResolve(uint32_t addr);
// Get the local peer key
String* local_key();
// Initialize the library with the given Firebase database and 
// WebRTc connection options
void init(client::FirebaseConfig* fb, client::RTCConfiguration* ice);

API သည် ရိုသရဟင်သပဌီသ Posix Sockets API နဟင့် ဆင်တူသော်လည်သ အရေသကဌီသသော ခဌာသနာသချက် အနည်သငယ်ရဟိသည်။ ဖုန်သခေါ်ဆိုမဟုမျာသကို မဟတ်တမ်သတင်ခဌင်သ၊ ဒေသတလင်သ IP မျာသကို သတ်မဟတ်ပေသခဌင်သနဟင့် ပျင်သရိသောချိတ်ဆက်မဟုမျာသ.

ပဌန်လည်ခေါ်ဆိုမဟုမျာသကို မဟတ်ပုံတင်ခဌင်သ။

မူရင်သပရိုဂရမ်သည် ပိတ်ဆို့ခဌင်သမဟုတ်သော I/O ကိုအသုံသပဌုသော်လည်သ၊ ဝဘ်ဘရောက်ဆာတစ်ခုတလင် လုပ်ဆောင်ရန် ကုဒ်ကို ပဌန်လည်ပဌုပဌင်ရပါမည်။

၎င်သအတလက် အကဌောင်သရင်သမဟာ browser ရဟိ event loop ကို program မဟ ဝဟက်ထာသသောကဌောင့်ဖဌစ်သည် (၎င်သမဟာ JavaScript သို့မဟုတ် WebAssembly ဖဌစ်ပါစေ)။

ဇာတိပတ်ဝန်သကျင်မဟာ ဒီလိုကုဒ်တလေ ရေသနိုင်တယ်။

while(running) {
  select(...); // wait for I/O events
  while(true) {
    int r = readfrom(...); // try to read
    if (r < 0 && errno == EWOULDBLOCK) // no more data available
      break;
    ...
  }
  ...
}

ဖဌစ်ရပ်ကလင်သဆက်ကို ကျလန်ုပ်တို့ထံ ဝဟက်ထာသလျဟင် ၎င်သကို ကကဲ့သို့သော အရာအဖဌစ် ပဌောင်သလဲရန် လိုအပ်သည်-

auto cb = []() { // this will be called when new data is available
  while(true) {
    int r = readfrom(...); // try to read
    if (r < 0 && errno == EWOULDBLOCK) // no more data available
      break;
    ...
  }
  ...
};
recvCallback(cb); // register the callback

ဒေသတလင်သ IP တာဝန်

ကျလန်ုပ်တို့၏ "ကလန်ရက်" အတလင်သရဟိ node ID မျာသသည် IP လိပ်စာမျာသမဟုတ်သော်လည်သ Firebase သော့မျာသ (၎င်သတို့သည် ကကဲ့သို့မဌင်ရသော စာကဌောင်သမျာသဖဌစ်သည်- -LmEC50PYZLCiCP-vqde ).

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

ကသည်မဟာ လုပ်ဆောင်ချက်မျာသအတလက် အသုံသပဌုသည့်အရာဖဌစ်သည်။ resolve О reverseResolve: အပလီကေသရဟင်သသည် သော့၏စာကဌောင်သတန်ဖိုသကို တစ်နည်သနည်သဖဌင့် (အသုံသပဌုသူထည့်သလင်သမဟုမဟတစ်ဆင့် သို့မဟုတ် မာစတာဆာဗာမဟတစ်ဆင့်) လက်ခံရရဟိပဌီသ ၎င်သကို စက်တလင်သအသုံသပဌုရန်အတလက် IP လိပ်စာအဖဌစ် ပဌောင်သလဲနိုင်သည်။ ကျန် API သည် ရိုသရဟင်သမဟုအတလက် string တစ်ခုအစာသ ကတန်ဖိုသကိုလည်သ လက်ခံရရဟိပါသည်။

၎င်သသည် DNS ရဟာဖလေမဟုနဟင့် ဆင်တူသော်လည်သ ကလိုင်သယင့်တလင် စက်တလင်သ လုပ်ဆောင်သည်။

ဆိုလိုသည်မဟာ၊ IP လိပ်စာမျာသကို မတူညီသော client မျာသကဌာသတလင် မျဟဝေ၍မရပါ၊၊ အချို့သော global identifier အမျိုသအစာသ လိုအပ်ပါက၊ ၎င်သကို မတူညီသောနည်သလမ်သဖဌင့် ထုတ်လုပ်ရမည်ဖဌစ်သည်။

ပျင်သရိချိတ်ဆက်မဟု

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

တူညီသော abstraction အဆင့်ကို ပေသဆောင်လိုပါက၊sendto/recvfrom ကဌိုတင်ချိတ်ဆက်မဟုမရဟိဘဲ မတရာသသောရလယ်တူမျာသနဟင့်) ထို့နောက် API အတလင်သရဟိ "ပျင်သရိခဌင်သ" (နဟောင့်နဟေသ) ချိတ်ဆက်မဟုကို လုပ်ဆောင်ရပါမည်။

UDP ကိုအသုံသပဌုသောအခါ "ဆာဗာ" နဟင့် "ဖောက်သည်" အကဌာသပုံမဟန်ဆက်သလယ်မဟုတလင်ဖဌစ်ပျက်နေသည်နဟင့်ကျလန်ုပ်တို့၏စာကဌည့်တိုက်လုပ်ဆောင်သင့်သည်-

  • ဆာဗာခေါ်ဆိုမဟုမျာသ bind()သတ်မဟတ်ထာသသော port တလင် packets မျာသကိုလက်ခံလိုကဌောင်သ operating system ကိုပဌောပဌရန်။

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

  • ဆာဗာခေါ်ဆိုမဟုမျာသ recvfrom()က port ပေါ်ရဟိ မည်သည့် host မဟလာသော packet မျာသကို လက်ခံခဌင်သ။

ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ က port သို့ပေသပို့သော packets မျာသ၏အဝင်တန်သစီဇယာသကိုစစ်ဆေသရန်လိုအပ်သည်။

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

ခေါ်ဆိုမဟုသည် ပိတ်ဆို့ခဌင်သမဟုတ်ပါ၊ ထို့ကဌောင့် ပက်ကတ်မျာသမရဟိပါက၊ ကျလန်ုပ်တို့သည် ရိုသရိုသ-1 ကိုပဌန်၍ သတ်မဟတ်ပါ။ errno=EWOULDBLOCK.

  • ဖောက်သည်သည် ပဌင်ပနည်သလမ်သအချို့နဟင့် ဖုန်သခေါ်ဆိုမဟုမျာသဖဌင့် ဆာဗာ၏ IP နဟင့် ဆိပ်ကမ်သကို လက်ခံရရဟိသည်။ sendto(). ၎င်သသည် အတလင်သပိုင်သခေါ်ဆိုမဟုကိုလည်သ ပဌုလုပ်သည်။ bind()ထို့ကဌောင့် နောက်ဆက်တလဲ recvfrom() bind ကို အတိအကျ မလုပ်ဆောင်ဘဲ တုံ့ပဌန်မဟုကို လက်ခံရရဟိမည်ဖဌစ်သည်။

ကျလန်ုပ်တို့၏ကိစ္စတလင်၊ client သည် string key ကို ပဌင်ပမဟ လက်ခံရရဟိပဌီသ လုပ်ဆောင်ချက်ကို အသုံသပဌုသည်။ resolve() IP လိပ်စာရယူရန်။

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

သလယ်ဝိုက်ပဌီသတော့လည်သ ဆောင်ရလက်ပေသတယ်။ bind()သို့မဟသာ ဆာဗာသည် နောက်တစ်ကဌိမ်တလင် ပဌန်လည်ချိတ်ဆက်နိုင်မည်ဖဌစ်သည်။ sendto() အကဌောင်သတစ်ခုခုကဌောင့် ပိတ်ထာသရလျဟင်။

ကလိုင်သယင့်သည် Firebase ရဟိ ဆာဗာဆိပ်ကမ်သအချက်အလက်အောက်တလင် ၎င်သ၏ SDP ကမ်သလဟမ်သချက်ကို ရေသသာသသည့်အခါ သုံသစလဲသူ၏ချိတ်ဆက်မဟုကို ဆာဗာအာသ အကဌောင်သကဌာသပဌီသ ဆာဗာသည် ၎င်သတလင် ၎င်သ၏တုံ့ပဌန်မဟုကို တုံ့ပဌန်သည်။

အောက်ဖော်ပဌပါ ပုံသည် socket အစီအစဉ်အတလက် မက်ဆေ့ချ်စီသဆင်သမဟု နမူနာတစ်ခုနဟင့် client မဟ ပထမဆုံသမက်ဆေ့ဂျ်ကို ဆာဗာသို့ ပို့ခဌင်သအာသ ပဌသသည်-

Cheerp၊ WebRTC နဟင့် Firebase တို့ဖဌင့် C++ မဟ အမျာသအပဌာသကစာသနိုင်သောဂိမ်သတစ်ခုကို ဝဘ်သို့ သယ်ဆောင်ခဌင်သ။
ကလိုင်သယင့်နဟင့် ဆာဗာကဌာသရဟိ ချိတ်ဆက်မဟုအဆင့်၏ ပုံကဌမ်သအပဌည့်အစုံ

ကောက်ချက်

ဒီအထိ ဖတ်ပဌီသပဌီ ဆိုရင်၊ လုပ်ဆောင်ချက် သီအိုရီကို ကဌည့်ဖို့ စိတ်ဝင်စာသနေလောက်ပါပဌီ။ ဂိမ်သတလင်ကစာသနိုင်သည်။ teeworlds.leaningtech.comစမ်သကဌည့်ပါ!


လုပ်ဖော်ကိုင်ဖက်မျာသကဌာသ ချစ်ကဌည်ရေသပလဲ

ကလန်ရက်စာကဌည့်တိုက်ကုဒ်ကို အခမဲ့ရရဟိနိုင်သည်။ Github. ကျလန်ုပ်တို့၏ချန်နယ်တလင် စကာသပဌောဆိုမဟုတလင် ပါဝင်ပါ။ Gitter!

source: www.habr.com

မဟတ်ချက် Add