ื”ืขื‘ืจื” ืฉืœ ืžืฉื—ืง ืžืจื•ื‘ื” ืžืฉืชืชืคื™ื ืž-C++ ืœืื™ื ื˜ืจื ื˜ ืขื Cheerp, WebRTC ื•-Firebase

ืžื‘ื•ื

ื”ื—ื‘ืจื” ืฉืœื ื• Leaning Technologies ืžืกืคืง ืคืชืจื•ื ื•ืช ืœื”ืขื‘ืจืช ื™ื™ืฉื•ืžื™ ืฉื•ืœื—ืŸ ืขื‘ื•ื“ื” ืžืกื•ืจืชื™ื™ื ืœืื™ื ื˜ืจื ื˜. ืžื”ื“ืจ C++ ืฉืœื ื• ืœืฉืžื— ื™ื•ืฆืจ ืฉื™ืœื•ื‘ ืฉืœ WebAssembly ื•-JavaScript, ื”ืžืกืคืง ืืช ืฉื ื™ื”ื ืื™ื ื˜ืจืืงืฆื™ื” ืคืฉื•ื˜ื” ื‘ื“ืคื“ืคืŸ, ื•ื‘ื™ืฆื•ืขื™ื ื’ื‘ื•ื”ื™ื.

ื›ื“ื•ื’ืžื” ืœื™ื™ืฉื•ื ืฉืœื•, ื”ื—ืœื˜ื ื• ืœื”ืขื‘ื™ืจ ืžืฉื—ืง ืžืจื•ื‘ื” ืžืฉืชืชืคื™ื ืœืจืฉืช ื•ื‘ื—ืจื ื• Teeworlds. Teeworlds ื”ื•ื ืžืฉื—ืง ืจื˜ืจื• ื“ื• ืžื™ืžื“ื™ ืžืจื•ื‘ื” ืžืฉืชืชืคื™ื ืขื ืงื”ื™ืœื” ืงื˜ื ื” ืืš ืคืขื™ืœื” ืฉืœ ืฉื—ืงื ื™ื (ื›ื•ืœืœ ืื ื™!). ื”ื•ื ืงื˜ืŸ ื”ืŸ ืžื‘ื—ื™ื ืช ืžืฉืื‘ื™ื ืฉื”ื•ืจื“ื• ื•ื”ืŸ ืžื‘ื—ื™ื ืช ื“ืจื™ืฉื•ืช ืžืขื‘ื“ ื•-GPU - ืžื•ืขืžื“ ืื™ื“ื™ืืœื™.

ื”ืขื‘ืจื” ืฉืœ ืžืฉื—ืง ืžืจื•ื‘ื” ืžืฉืชืชืคื™ื ืž-C++ ืœืื™ื ื˜ืจื ื˜ ืขื Cheerp, WebRTC ื•-Firebase
ืคื•ืขืœ ื‘ื“ืคื“ืคืŸ Teeworlds

ื”ื—ืœื˜ื ื• ืœื”ืฉืชืžืฉ ื‘ืคืจื•ื™ืงื˜ ื”ื–ื” ื›ื“ื™ ืœื”ืชื ืกื•ืช ื‘ื• ืคืชืจื•ื ื•ืช ื›ืœืœื™ื™ื ืœื”ืขื‘ืจืช ืงื•ื“ ืจืฉืช ืœืื™ื ื˜ืจื ื˜. ื–ื” ื ืขืฉื” ื‘ื“ืจืš ื›ืœืœ ื‘ื“ืจื›ื™ื ื”ื‘ืื•ืช:

  • XMLHttpRequest/ืื—ื–ื•ืจ, ืื ื—ืœืง ื”ืจืฉืช ืžื•ืจื›ื‘ ืจืง ืžื‘ืงืฉื•ืช HTTP, ืื•
  • WebSockets.

ืฉื ื™ ื”ืคืชืจื•ื ื•ืช ื“ื•ืจืฉื™ื ืื™ืจื•ื— ืฉืœ ืจื›ื™ื‘ ืฉืจืช ื‘ืฆื“ ื”ืฉืจืช, ื•ืื™ื ื ืžืืคืฉืจื™ื ืฉื™ืžื•ืฉ ื›ืคืจื•ื˜ื•ืงื•ืœ ืชื—ื‘ื•ืจื” UDP. ื–ื” ื—ืฉื•ื‘ ืœื™ื™ืฉื•ืžื™ื ื‘ื–ืžืŸ ืืžืช ื›ืžื• ืชื•ื›ื ื•ืช ืœืฉื™ื—ื•ืช ื•ืขื™ื“ื” ื‘ื•ื•ื™ื“ืื• ื•ืžืฉื—ืงื™ื, ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืžื‘ื˜ื™ื— ืืช ื”ืžืกื™ืจื” ื•ื”ื”ื–ืžื ื” ืฉืœ ืžื ื•ืช ืคืจื•ื˜ื•ืงื•ืœ TCP ืขืœื•ืœ ืœื”ืคื•ืš ืœืžื›ืฉื•ืœ ืœืื—ื‘ื™ื•ืŸ ื ืžื•ืš.

ื™ืฉ ื“ืจืš ืฉืœื™ืฉื™ืช - ื”ืฉืชืžืฉ ื‘ืจืฉืช ืžื”ื“ืคื“ืคืŸ: WebRTC.

RTCDataChannel ื”ื•ื ืชื•ืžืš ื’ื ื‘ืฉื™ื“ื•ืจ ืืžื™ืŸ ื•ื’ื ืœื ืืžื™ืŸ (ื‘ืžืงืจื” ื”ืื—ืจื•ืŸ ื”ื•ื ืžื ืกื” ืœื”ืฉืชืžืฉ ื‘-UDP ื›ืคืจื•ื˜ื•ืงื•ืœ ืชืขื‘ื•ืจื” ื‘ืžื™ื“ืช ื”ืืคืฉืจ), ื•ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื’ื ืขื ืฉืจืช ืžืจื•ื—ืง ื•ื’ื ื‘ื™ืŸ ื“ืคื“ืคื ื™ื. ื–ื” ืื•ืžืจ ืฉืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืขื‘ื™ืจ ืืช ื›ืœ ื”ืืคืœื™ืงืฆื™ื” ืœื“ืคื“ืคืŸ, ื›ื•ืœืœ ืจื›ื™ื‘ ื”ืฉืจืช!

ืขื ื–ืืช, ื–ื” ื‘ื ืขื ืงื•ืฉื™ ื ื•ืกืฃ: ืœืคื ื™ ืฉืฉื ื™ ืขืžื™ืชื™ื ืฉืœ WebRTC ื™ื›ื•ืœื™ื ืœืชืงืฉืจ, ื”ื ืฆืจื™ื›ื™ื ืœื‘ืฆืข ืœื—ื™ืฆืช ื™ื“ ืžื•ืจื›ื‘ืช ื™ื—ืกื™ืช ื›ื“ื™ ืœื”ืชื—ื‘ืจ, ืžื” ืฉืžืฆืจื™ืš ื›ืžื” ื™ืฉื•ื™ื•ืช ืฉืœ ืฆื“ ืฉืœื™ืฉื™ (ืฉืจืช ืื™ืชื•ืช ื•ืฉืจืช ืื—ื“ ืื• ื™ื•ืชืจ ืœึฐื–ึทืขื–ึตืขึท/ืชื•ืจ).

ื‘ืื•ืคืŸ ืื™ื“ื™ืืœื™, ื ืจืฆื” ืœื™ืฆื•ืจ ืžืžืฉืง API ืœืจืฉืช ืฉืžืฉืชืžืฉ ื‘-WebRTC ื‘ืื•ืคืŸ ืคื ื™ืžื™, ืืš ืงืจื•ื‘ ื›ื›ืœ ื”ืืคืฉืจ ืœืžืžืฉืง UDP Sockets ืฉืื™ื ื• ืฆืจื™ืš ืœื™ืฆื•ืจ ื—ื™ื‘ื•ืจ.

ื–ื” ื™ืืคืฉืจ ืœื ื• ืœื ืฆืœ ืืช ื”ื™ืชืจื•ื ื•ืช ืฉืœ WebRTC ืžื‘ืœื™ ืœื—ืฉื•ืฃ ืคืจื˜ื™ื ืžื•ืจื›ื‘ื™ื ืœืงื•ื“ ื”ืืคืœื™ืงืฆื™ื” (ืฉืจืฆื™ื ื• ืœืฉื ื•ืช ื›ืžื” ืฉืคื—ื•ืช ื‘ืคืจื•ื™ืงื˜ ืฉืœื ื•).

ืžื™ื ื™ืžื•ื WebRTC

WebRTC ื”ื•ื ืงื‘ื•ืฆื” ืฉืœ ืžืžืฉืงื™ API ื”ื–ืžื™ื ื™ื ื‘ื“ืคื“ืคื ื™ื ื”ืžืกืคืงื™ื ืฉื™ื“ื•ืจ ืขืžื™ืช ืœืขืžื™ืช ืฉืœ ืื•ื“ื™ื•, ื•ื™ื“ืื• ื•ื ืชื•ื ื™ื ืฉืจื™ืจื•ืชื™ื™ื.

ื”ื—ื™ื‘ื•ืจ ื‘ื™ืŸ ืขืžื™ืชื™ื ื ื•ืฆืจ (ื’ื ืื ื™ืฉ NAT ื‘ืื—ื“ ื”ืฆื“ื“ื™ื ืื• ื‘ืฉื ื™ ื”ืฆื“ื“ื™ื) ื‘ืืžืฆืขื•ืช ืฉืจืชื™ STUN ื•/ืื• TURN ื‘ืืžืฆืขื•ืช ืžื ื’ื ื•ืŸ ื”ื ืงืจื ICE. ืขืžื™ืชื™ื ืžื—ืœื™ืคื™ื ืžื™ื“ืข ICE ื•ืคืจืžื˜ืจื™ื ืฉืœ ืขืจื•ืฅ ื‘ืืžืฆืขื•ืช ื”ืฆืขื” ื•ืชืฉื•ื‘ื” ืฉืœ ืคืจื•ื˜ื•ืงื•ืœ SDP.

ื•ื•ืื•! ื›ืžื” ืงื™ืฆื•ืจื™ื ื‘ื‘ืช ืื—ืช? ื‘ื•ืื• ื ืกื‘ื™ืจ ื‘ืงืฆืจื” ืžื” ืžืฉืžืขื•ืช ื”ืžื•ื ื—ื™ื ื”ืืœื”:

  • ื›ืœื™ ืขื–ืจ ืœืžืขื‘ืจ ื”ืคืขืœื” ืขื‘ื•ืจ NAT (ืœึฐื–ึทืขื–ึตืขึท) - ืคืจื•ื˜ื•ืงื•ืœ ืœืขืงื•ืฃ NAT ื•ืงื‘ืœืช ื–ื•ื’ (IP, ื™ืฆื™ืื”) ืœื”ื—ืœืคืช ื ืชื•ื ื™ื ื™ืฉื™ืจื•ืช ืขื ื”ืžืืจื—. ืื ื”ื•ื ืžืฆืœื™ื— ืœื”ืฉืœื™ื ืืช ื”ืžืฉื™ืžื” ืฉืœื•, ืื– ืขืžื™ืชื™ื ื™ื›ื•ืœื™ื ืœื”ื—ืœื™ืฃ ื ืชื•ื ื™ื ื–ื” ืขื ื–ื” ื‘ืื•ืคืŸ ืขืฆืžืื™.
  • ืžืขื‘ืจ ื‘ืืžืฆืขื•ืช ืžืžืกืจื™ื ืกื‘ื™ื‘ NAT (ืชื•ืจ) ืžืฉืžืฉ ื’ื ืœืžืขื‘ืจ NAT, ืืš ื”ื•ื ืžื™ื™ืฉื ื–ืืช ืขืœ ื™ื“ื™ ื”ืขื‘ืจืช ื ืชื•ื ื™ื ื“ืจืš ืคืจื•ืงืกื™ ื”ื’ืœื•ื™ ืœืฉื ื™ ื”ืขืžื™ืชื™ื. ื–ื” ืžื•ืกื™ืฃ ื—ื‘ื™ื•ืŸ ื•ื™ืงืจ ื™ื•ืชืจ ืœื™ื™ืฉื•ื ืžืืฉืจ STUN (ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืžื™ื•ืฉื ืœืื•ืจืš ื›ืœ ืกืฉืŸ ื”ืชืงืฉื•ืจืช), ืื‘ืœ ืœืคืขืžื™ื ื–ื• ื”ืืคืฉืจื•ืช ื”ื™ื—ื™ื“ื”.
  • ื”ืงืžืช ืงื™ืฉื•ืจื™ื•ืช ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ืช (ืงืจื—) ืžืฉืžืฉ ืœื‘ื—ื™ืจืช ื”ืฉื™ื˜ื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ ืœื—ื™ื‘ื•ืจ ืฉื ื™ ืขืžื™ืชื™ื ื‘ื”ืชื‘ืกืก ืขืœ ืžื™ื“ืข ื”ืžืชืงื‘ืœ ืžื—ื™ื‘ื•ืจ ืขืžื™ืชื™ื ื™ืฉื™ืจื•ืช, ื›ืžื• ื’ื ืžื™ื“ืข ื”ืžืชืงื‘ืœ ืขืœ ื™ื“ื™ ื›ืœ ืžืกืคืจ ืฉืœ ืฉืจืชื™ STUN ื•-TURN.
  • ืคืจื•ื˜ื•ืงื•ืœ ืชื™ืื•ืจ ื”ืคืขืœื” (SDP) ื”ื•ื ืคื•ืจืžื˜ ืœืชื™ืื•ืจ ืคืจืžื˜ืจื™ื ืฉืœ ืขืจื•ืฆื™ ื—ื™ื‘ื•ืจ, ืœืžืฉืœ, ืžื•ืขืžื“ื™ ICE, ืงื•ื“ืงื™ื ืžื•ืœื˜ื™ืžื“ื™ื” (ื‘ืžืงืจื” ืฉืœ ืขืจื•ืฅ ืื•ื“ื™ื•/ื•ื™ื“ืื•) ื•ื›ื•'... ืื—ื“ ืžื”ืขืžื™ืชื™ื ืฉื•ืœื— ื”ืฆืขืช SDP, ื•ื”ืฉื ื™ ืžื’ื™ื‘ ื‘-SDP Answer . ืœืื—ืจ ืžื›ืŸ, ื ื•ืฆืจ ืขืจื•ืฅ.

ื›ื“ื™ ืœื™ืฆื•ืจ ื—ื™ื‘ื•ืจ ื›ื–ื”, ืขืžื™ืชื™ื ืฆืจื™ื›ื™ื ืœืืกื•ืฃ ืืช ื”ืžื™ื“ืข ืฉื”ื ืžืงื‘ืœื™ื ืžืฉืจืชื™ STUN ื•-TURN ื•ืœื”ื—ืœื™ืฃ ืื•ืชื• ื–ื” ืขื ื–ื”.

ื”ื‘ืขื™ื” ื”ื™ื ืฉืขื“ื™ื™ืŸ ืื™ืŸ ืœื”ื ืืช ื”ื™ื›ื•ืœืช ืœืชืงืฉืจ ื™ืฉื™ืจื•ืช, ื•ืœื›ืŸ ื—ื™ื™ื‘ ืœื”ืชืงื™ื™ื ืžื ื’ื ื•ืŸ ืžื—ื•ืฅ ืœืคืก ื›ื“ื™ ืœื”ื—ืœื™ืฃ ืืช ื”ื ืชื•ื ื™ื ื”ืืœื”: ืฉืจืช ืื™ืชื•ืช.

ืฉืจืช ืื™ืชื•ืชื™ื ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžืื•ื“ ืคืฉื•ื˜ ืžื›ื™ื•ื•ืŸ ืฉืชืคืงื™ื“ื• ื”ื™ื—ื™ื“ ื”ื•ื ืœื”ืขื‘ื™ืจ ื ืชื•ื ื™ื ื‘ื™ืŸ ืขืžื™ืชื™ื ื‘ืฉืœื‘ ืœื—ื™ืฆืช ื”ื™ื“ (ื›ืžืชื•ืืจ ื‘ืชืจืฉื™ื ืœืžื˜ื”).

ื”ืขื‘ืจื” ืฉืœ ืžืฉื—ืง ืžืจื•ื‘ื” ืžืฉืชืชืคื™ื ืž-C++ ืœืื™ื ื˜ืจื ื˜ ืขื Cheerp, WebRTC ื•-Firebase
ื“ื™ืื’ืจืžืช ืจืฆืฃ ืœื—ื™ืฆืช ื™ื“ WebRTC ืคืฉื•ื˜ื”

ืกืงื™ืจืช ืžื•ื“ืœื™ื ืฉืœ ืจืฉืช Teeworlds

ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ืจืฉืช ืฉืœ Teeworlds ื”ื™ื ืคืฉื•ื˜ื” ืžืื•ื“:

  • ืจื›ื™ื‘ื™ ื”ืœืงื•ื— ื•ื”ืฉืจืช ื”ื ืฉืชื™ ืชื•ื›ื ื™ื•ืช ืฉื•ื ื•ืช.
  • ืœืงื•ื—ื•ืช ื ื›ื ืกื™ื ืœืžืฉื—ืง ืขืœ ื™ื“ื™ ื—ื™ื‘ื•ืจ ืœืื—ื“ ืžื›ืžื” ืฉืจืชื™ื, ืฉื›ืœ ืื—ื“ ืžื”ื ืžืืจื— ืจืง ืžืฉื—ืง ืื—ื“ ื‘ื›ืœ ืคืขื.
  • ื›ืœ ื”ืขื‘ืจืช ื”ื ืชื•ื ื™ื ื‘ืžืฉื—ืง ืžืชื‘ืฆืขืช ื“ืจืš ื”ืฉืจืช.
  • ืฉืจืช ืจืืฉื™ ืžื™ื•ื—ื“ ืžืฉืžืฉ ืœืื™ืกื•ืฃ ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”ืฉืจืชื™ื ื”ืฆื™ื‘ื•ืจื™ื™ื ื”ืžื•ืฆื’ื™ื ื‘ืœืงื•ื— ื”ืžืฉื—ืง.

ื”ื•ื“ื•ืช ืœืฉื™ืžื•ืฉ ื‘-WebRTC ืœื”ื—ืœืคืช ื ืชื•ื ื™ื, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืขื‘ื™ืจ ืืช ืจื›ื™ื‘ ื”ืฉืจืช ืฉืœ ื”ืžืฉื—ืง ืœื“ืคื“ืคืŸ ื‘ื• ื ืžืฆื ื”ืœืงื•ื—. ื–ื” ื ื•ืชืŸ ืœื ื• ื”ื–ื“ืžื ื•ืช ืžืฆื•ื™ื ืช...

ื”ื™ืคื˜ืจ ืžืฉืจืชื™ื

ืœื—ื•ืกืจ ืœื•ื’ื™ืงื” ืฉืœ ื”ืฉืจืช ื™ืฉ ื™ืชืจื•ืŸ ื ื—ืžื“: ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืคืจื•ืก ืืช ื›ืœ ื”ืืคืœื™ืงืฆื™ื” ื›ืชื•ื›ืŸ ืกื˜ื˜ื™ ื‘ื“ืคื™ Github ืื• ื‘ื—ื•ืžืจื” ืฉืœื ื• ืžืื—ื•ืจื™ Cloudflare, ื•ื‘ื›ืš ืœื”ื‘ื˜ื™ื— ื”ื•ืจื“ื•ืช ืžื”ื™ืจื•ืช ื•ื–ืžืŸ ืคืขื•ืœื” ื’ื‘ื•ื” ื‘ื—ื™ื ื. ืœืžืขืฉื”, ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืฉื›ื•ื— ืžื”ื, ื•ืื ื™ืชืžื–ืœ ืžื–ืœื ื• ื•ื”ืžืฉื—ืง ื™ื”ืคื•ืš ืœืคื•ืคื•ืœืจื™, ืื– ื”ืชืฉืชื™ืช ืœื ืชืฆื˜ืจืš ืœืขื‘ื•ืจ ืžื•ื“ืจื ื™ื–ืฆื™ื”.

ืขื ื–ืืช, ื›ื“ื™ ืฉื”ืžืขืจื›ืช ืชืขื‘ื•ื“, ืื ื—ื ื• ืขื“ื™ื™ืŸ ืฆืจื™ื›ื™ื ืœื”ืฉืชืžืฉ ื‘ืืจื›ื™ื˜ืงื˜ื•ืจื” ื—ื™ืฆื•ื ื™ืช:

  • ืฉืจืช STUN ืื—ื“ ืื• ื™ื•ืชืจ: ื™ืฉ ืœื ื• ื›ืžื” ืืคืฉืจื•ื™ื•ืช ื—ื™ื ืžื™ื•ืช ืœื‘ื—ื™ืจื”.
  • ืœืคื—ื•ืช ืฉืจืช TURN ืื—ื“: ืื™ืŸ ื›ืืŸ ืืคืฉืจื•ื™ื•ืช ื—ื™ื ืžื™ื•ืช, ืื– ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ื’ื“ื™ืจ ืžืฉืœื ื• ืื• ืœืฉืœื ืขื‘ื•ืจ ื”ืฉื™ืจื•ืช. ืœืžืจื‘ื” ื”ืžื–ืœ, ืจื•ื‘ ื”ื–ืžืŸ ื ื™ืชืŸ ืœื™ืฆื•ืจ ืืช ื”ื—ื™ื‘ื•ืจ ื“ืจืš ืฉืจืชื™ STUN (ื•ืœืกืคืง p2p ืืžื™ืชื™), ืื‘ืœ ื™ืฉ ืฆื•ืจืš ื‘-TURN ื›ืืคืฉืจื•ืช ืกืชื™ืจื”.
  • ืฉืจืช ืื™ืชื•ืช: ื‘ื ื™ื’ื•ื“ ืœืฉื ื™ ื”ื”ื™ื‘ื˜ื™ื ื”ืื—ืจื™ื, ื”ืื™ืชื•ืช ืื™ื ื• ืกื˜ื ื“ืจื˜ื™. ืขืœ ืžื” ืฉืจืช ื”ืื™ืชื•ืช ื™ื”ื™ื” ืื—ืจืื™ ื‘ืคื•ืขืœ ืชืœื•ื™ ื‘ืžื™ื“ื” ืžืกื•ื™ืžืช ื‘ืืคืœื™ืงืฆื™ื”. ื‘ืžืงืจื” ืฉืœื ื•, ืœืคื ื™ ื™ืฆื™ืจืช ื—ื™ื‘ื•ืจ, ื™ืฉ ืฆื•ืจืš ืœื”ื—ืœื™ืฃ ื›ืžื•ืช ืงื˜ื ื” ืฉืœ ื ืชื•ื ื™ื.
  • Teeworlds Master Server: ื”ื•ื ืžืฉืžืฉ ืขืœ ื™ื“ื™ ืฉืจืชื™ื ืื—ืจื™ื ื›ื“ื™ ืœื”ื›ืจื™ื– ืขืœ ืงื™ื•ืžื ื•ืขืœ ื™ื“ื™ ืœืงื•ื—ื•ืช ื›ื“ื™ ืœืžืฆื•ื ืฉืจืชื™ื ืฆื™ื‘ื•ืจื™ื™ื. ืืžื ื ื–ื” ืœื ื”ื›ืจื—ื™ (ืœืงื•ื—ื•ืช ื™ื›ื•ืœื™ื ืชืžื™ื“ ืœื”ืชื—ื‘ืจ ืœืฉืจืช ืฉื”ื ืžื›ื™ืจื™ื ื™ื“ื ื™ืช), ื–ื” ื™ื”ื™ื” ื ื—ืžื“ ื›ื“ื™ ืฉืฉื—ืงื ื™ื ื™ื•ื›ืœื• ืœื”ืฉืชืชืฃ ื‘ืžืฉื—ืงื™ื ืขื ืื ืฉื™ื ืืงืจืื™ื™ื.

ื”ื—ืœื˜ื ื• ืœื”ืฉืชืžืฉ ื‘ืฉืจืชื™ STUN ื”ื—ื™ื ืžื™ื™ื ืฉืœ ื’ื•ื’ืœ, ื•ืคืจืกื ื• ืฉืจืช TURN ืื—ื“ ื‘ืขืฆืžื ื•.

ืขื‘ื•ืจ ืฉืชื™ ื”ื ืงื•ื“ื•ืช ื”ืื—ืจื•ื ื•ืช ื”ืฉืชืžืฉื ื• Firebase:

  • ืฉืจืช ื”ืžืืกื˜ืจ ืฉืœ Teeworlds ืžื™ื•ืฉื ื‘ืฆื•ืจื” ืคืฉื•ื˜ื” ืžืื•ื“: ื›ืจืฉื™ืžื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ื”ืžื›ื™ืœื™ื ืžื™ื“ืข (ืฉื, IP, ืžืคื”, ืžืฆื‘,...) ืฉืœ ื›ืœ ืฉืจืช ืคืขื™ืœ. ืฉืจืชื™ื ืžืคืจืกืžื™ื ื•ืžืขื“ื›ื ื™ื ืืช ื”ืื•ื‘ื™ื™ืงื˜ ืฉืœื”ื, ื•ืœืงื•ื—ื•ืช ืœื•ืงื—ื™ื ืืช ื›ืœ ื”ืจืฉื™ืžื” ื•ืžืฆื™ื’ื™ื ืื•ืชื” ืœื ื’ืŸ. ืื ื—ื ื• ื’ื ืžืฆื™ื’ื™ื ืืช ื”ืจืฉื™ืžื” ื‘ื“ืฃ ื”ื‘ื™ืช ื›-HTML ื›ืš ืฉืฉื—ืงื ื™ื ื™ื›ื•ืœื™ื ืคืฉื•ื˜ ืœืœื—ื•ืฅ ืขืœ ื”ืฉืจืช ื•ืœื”ื™ืœืงื— ื™ืฉืจ ืœืžืฉื—ืง.
  • ืื™ืชื•ืช ืงืฉื•ืจ ืงืฉืจ ื”ื“ื•ืง ืœื™ื™ืฉื•ื ื”ืฉืงืขื™ื ืฉืœื ื•, ื”ืžืชื•ืืจ ื‘ืกืขื™ืฃ ื”ื‘ื.

ื”ืขื‘ืจื” ืฉืœ ืžืฉื—ืง ืžืจื•ื‘ื” ืžืฉืชืชืคื™ื ืž-C++ ืœืื™ื ื˜ืจื ื˜ ืขื Cheerp, WebRTC ื•-Firebase
ืจืฉื™ืžืช ื”ืฉืจืชื™ื ื‘ืชื•ืš ื”ืžืฉื—ืง ื•ื‘ื“ืฃ ื”ื‘ื™ืช

ื™ื™ืฉื•ื ืฉืงืขื™ื

ืื ื—ื ื• ืจื•ืฆื™ื ืœื™ืฆื•ืจ API ืฉืงืจื•ื‘ ื›ื›ืœ ื”ืืคืฉืจ ืœ-Posix UDP Sockets ื›ื“ื™ ืœืžื–ืขืจ ืืช ืžืกืคืจ ื”ืฉื™ื ื•ื™ื™ื ื”ื“ืจื•ืฉื™ื.

ืื ื—ื ื• ื’ื ืจื•ืฆื™ื ืœื™ื™ืฉื ืืช ื”ืžื™ื ื™ืžื•ื ื”ื ื“ืจืฉ ืœื—ื™ืœื•ืคื™ ื”ื ืชื•ื ื™ื ื”ืคืฉื•ื˜ื™ื ื‘ื™ื•ืชืจ ื‘ืจืฉืช.

ืœื“ื•ื’ืžื”, ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ื ื™ืชื•ื‘ ืืžื™ืชื™: ื›ืœ ื”ืขืžื™ืชื™ื ื ืžืฆืื™ื ื‘ืื•ืชื• "LAN ื•ื™ืจื˜ื•ืืœื™" ื”ืžืฉื•ื™ืš ืœืžื•ืคืข ืžืกื“ ื ืชื•ื ื™ื ืกืคืฆื™ืคื™ ืฉืœ Firebase.

ืœื›ืŸ, ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ื›ืชื•ื‘ื•ืช 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 ืœื ื—ื•ืกื, ื™ืฉ ืœืฉื ื•ืช ืืช ื”ืงื•ื“ ืœื”ืคืขืœื” ื‘ื“ืคื“ืคืŸ ืื™ื ื˜ืจื ื˜.

ื”ืกื™ื‘ื” ืœื›ืš ื”ื™ื ืฉืœื•ืœืืช ื”ืื™ืจื•ืขื™ื ื‘ื“ืคื“ืคืŸ ืžื•ืกืชืจืช ืžื”ืชื•ื›ื ื” (ื‘ื™ืŸ ืื ื–ื” 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 ืžืงื•ืžื™ืช

ืžื–ื”ื™ ื”ืฆื•ืžืช ื‘"ืจืฉืช" ืฉืœื ื• ืื™ื ื ื›ืชื•ื‘ื•ืช IP, ืืœื ืžืคืชื—ื•ืช Firebase (ืืœื” ืžื—ืจื•ื–ื•ืช ืฉื ืจืื•ืช ื›ืš: -LmEC50PYZLCiCP-vqde ).

ื–ื” ื ื•ื— ื›ื™ ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืžื ื’ื ื•ืŸ ืœื”ืงืฆืืช ื›ืชื•ื‘ื•ืช IP ื•ื‘ื“ื™ืงืช ื”ื™ื™ื—ื•ื“ื™ื•ืช ืฉืœื”ืŸ (ื›ืžื• ื’ื ืกื™ืœื•ืงืŸ ืœืื—ืจ ืฉื”ืœืงื•ื— ืžืชื ืชืง), ืื‘ืœ ืœืจื•ื‘ ื™ืฉ ืฆื•ืจืš ืœื–ื”ื•ืช ืขืžื™ืชื™ื ืœืคื™ ืขืจืš ืžืกืคืจื™.

ื‘ื“ื™ื•ืง ื‘ืฉื‘ื™ืœ ื–ื” ื”ืคื•ื ืงืฆื™ื•ืช ืžืฉืžืฉื•ืช. resolve ะธ reverseResolve: ื”ืืคืœื™ืงืฆื™ื” ืžืงื‘ืœืช ืื™ื›ืฉื”ื• ืืช ืขืจืš ื”ืžื—ืจื•ื–ืช ืฉืœ ื”ืžืคืชื— (ื‘ืืžืฆืขื•ืช ืงืœื˜ ืžืฉืชืžืฉ ืื• ื“ืจืš ื”ืฉืจืช ื”ืจืืฉื™), ื•ื™ื›ื•ืœื” ืœื”ืžื™ืจ ืื•ืชื• ืœื›ืชื•ื‘ืช IP ืœืฉื™ืžื•ืฉ ืคื ื™ืžื™. ื’ื ืฉืืจ ื”-API ืžืงื‘ืœ ืืช ื”ืขืจืš ื”ื–ื” ื‘ืžืงื•ื ืžื—ืจื•ื–ืช ืœืฉื ื”ืคืฉื˜ื•ืช.

ื–ื” ื“ื•ืžื” ืœื—ื™ืคื•ืฉ DNS, ืืš ืžื‘ื•ืฆืข ื‘ืื•ืคืŸ ืžืงื•ืžื™ ื‘ืœืงื•ื—.

ื›ืœื•ืžืจ, ืœื ื ื™ืชืŸ ืœืฉืชืฃ ื›ืชื•ื‘ื•ืช IP ื‘ื™ืŸ ืœืงื•ื—ื•ืช ืฉื•ื ื™ื, ื•ืื ื™ืฉ ืฆื•ืจืš ื‘ืžื–ื”ื” ื’ืœื•ื‘ืœื™ ื›ืœืฉื”ื•, โ€‹โ€‹ื™ื”ื™ื” ืฆื•ืจืš ืœื”ืคื™ืง ืื•ืชื• ื‘ืฆื•ืจื” ืื—ืจืช.

ื—ื™ื‘ื•ืจ ืขืฆืœืŸ

UDP ืœื ืฆืจื™ืš ื—ื™ื‘ื•ืจ, ืื‘ืœ ื›ืคื™ ืฉืจืื™ื ื•, WebRTC ื“ื•ืจืฉ ืชื”ืœื™ืš ื—ื™ื‘ื•ืจ ืืจื•ืš ืœืคื ื™ ืฉื”ื•ื ื™ื›ื•ืœ ืœื”ืชื—ื™ืœ ืœื”ืขื‘ื™ืจ ื ืชื•ื ื™ื ื‘ื™ืŸ ืฉื ื™ ืขืžื™ืชื™ื.

ืื ืื ื—ื ื• ืจื•ืฆื™ื ืœืกืคืง ืืช ืื•ืชื” ืจืžืช ื”ืคืฉื˜ื”, (sendto/recvfrom ืขื ืขืžื™ืชื™ื ืฉืจื™ืจื•ืชื™ื™ื ืœืœื ื—ื™ื‘ื•ืจ ืงื•ื“ื), ืื– ืขืœื™ื”ื ืœื‘ืฆืข ื—ื™ื‘ื•ืจ "ืขืฆืœืŸ" (ืžืขื•ื›ื‘) ื‘ืชื•ืš ื”-API.

ื–ื” ืžื” ืฉืงื•ืจื” ื‘ืžื”ืœืš ืชืงืฉื•ืจืช ืจื’ื™ืœื” ื‘ื™ืŸ ื”"ืฉืจืช" ืœ"ืœืงื•ื—" ื‘ืขืช ืฉื™ืžื•ืฉ ื‘-UDP, ื•ืžื” ืฉื”ืกืคืจื™ื™ื” ืฉืœื ื• ืฆืจื™ื›ื” ืœืขืฉื•ืช:

  • ืฉื™ื—ื•ืช ืฉืจืช bind()ืœื•ืžืจ ืœืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉื”ื™ื ืจื•ืฆื” ืœืงื‘ืœ ืžื ื•ืช ื‘ื™ืฆื™ืื” ืฉืฆื•ื™ื ื”.

ื‘ืžืงื•ื ื–ืืช, ื ืคืจืกื ื™ืฆื™ืื” ืคืชื•ื—ื” ืœ-Firebase ืžืชื—ืช ืœืžืคืชื— ื”ืฉืจืช ื•ื ืงืฉื™ื‘ ืœืื™ืจื•ืขื™ื ื‘ืชืช-ืขืฅ ืฉืœื•.

  • ืฉื™ื—ื•ืช ืฉืจืช recvfrom(), ืžืงื‘ืœ ืžื ื•ืช ืฉืžื’ื™ืขื•ืช ืžื›ืœ ืžืืจื— ื‘ื™ืฆื™ืื” ื–ื•.

ื‘ืžืงืจื” ืฉืœื ื•, ืขืœื™ื ื• ืœื‘ื“ื•ืง ืืช ื”ืชื•ืจ ื”ื ื›ื ืก ืฉืœ ืžื ื•ืช ืฉื ืฉืœื—ื•ืช ืœื™ืฆื™ืื” ื–ื•.

ืœื›ืœ ื™ืฆื™ืื” ื™ืฉ ืชื•ืจ ืžืฉืœื”, ื•ืื ื• ืžื•ืกื™ืคื™ื ืืช ื™ืฆื™ืื•ืช ื”ืžืงื•ืจ ื•ื”ื™ืขื“ ืœืชื—ื™ืœืช ื“ื’ืžื™ ื”-WebRTC, ื›ืš ืฉื ื“ืข ืœืื™ื–ื” ืชื•ืจ ืœื”ืขื‘ื™ืจ ื›ืืฉืจ ืžื’ื™ืขื” ื—ื‘ื™ืœื” ื—ื“ืฉื”.

ื”ืฉื™ื—ื” ืื™ื ื” ื—ื•ืกืžืช, ืื– ืื ืื™ืŸ ืžื ื•ืช, ืื ื—ื ื• ืคืฉื•ื˜ ืžื—ื–ื™ืจื™ื -1 ื•ืžื’ื“ื™ืจื™ื errno=EWOULDBLOCK.

  • ื”ืœืงื•ื— ืžืงื‘ืœ ืืช ื”-IP ื•ื”ื™ืฆื™ืื” ืฉืœ ื”ืฉืจืช ื‘ืืžืฆืขื™ื ื—ื™ืฆื•ื ื™ื™ื, ื•ืžืชืงืฉืจ sendto(). ื–ื” ื’ื ืžื‘ืฆืข ืฉื™ื—ื” ืคื ื™ืžื™ืช. bind(), ื•ืœื›ืŸ ืœืื—ืจ ืžื›ืŸ recvfrom() ื™ืงื‘ืœ ืืช ื”ืชื’ื•ื‘ื” ืžื‘ืœื™ ืœื‘ืฆืข binding ื‘ืžืคื•ืจืฉ.

ื‘ืžืงืจื” ืฉืœื ื•, ื”ืœืงื•ื— ืžืงื‘ืœ ืžื‘ื—ื•ืฅ ืืช ืžืคืชื— ื”ืžื—ืจื•ื–ืช ื•ืžืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” resolve() ื›ื“ื™ ืœืงื‘ืœ ื›ืชื•ื‘ืช IP.

ื‘ืฉืœื‘ ื–ื”, ืื ื• ื™ื•ื–ืžื™ื ืœื—ื™ืฆืช ื™ื“ ืฉืœ WebRTC ืื ืฉื ื™ ื”ืขืžื™ืชื™ื ืขื“ื™ื™ืŸ ืœื ืžื—ื•ื‘ืจื™ื ื–ื” ืœื–ื”. ื—ื™ื‘ื•ืจื™ื ืœื™ืฆื™ืื•ืช ืฉื•ื ื•ืช ืฉืœ ืื•ืชื• ืขืžื™ืช ืžืฉืชืžืฉื™ื ื‘ืื•ืชื• WebRTC DataChannel.

ืื ื—ื ื• ื’ื ืžื‘ืฆืขื™ื ื‘ืขืงื™ืคื™ืŸ bind()ื›ื“ื™ ืฉื”ืฉืจืช ื™ื•ื›ืœ ืœื”ืชื—ื‘ืจ ืžื—ื“ืฉ ื‘ืคืขื ื”ื‘ืื” sendto() ืœืžืงืจื” ืฉื”ื•ื ื ืกื’ืจ ืžืกื™ื‘ื” ื›ืœืฉื”ื™.

ื”ืฉืจืช ืžืงื‘ืœ ื”ื•ื“ืขื” ืขืœ ื”ื—ื™ื‘ื•ืจ ืฉืœ ื”ืœืงื•ื— ื›ืืฉืจ ื”ืœืงื•ื— ื›ื•ืชื‘ ืืช ื”ืฆืขืช ื”-SDP ืฉืœื• ืžืชื—ืช ืœืžื™ื“ืข ืขืœ ื™ืฆื™ืืช ื”ืฉืจืช ื‘-Firebase, ื•ื”ืฉืจืช ืžื’ื™ื‘ ืขื ืชื’ื•ื‘ืชื• ืฉื.

ื”ืชืจืฉื™ื ืฉืœื”ืœืŸ ืžืฆื™ื’ ื“ื•ื’ืžื” ืฉืœ ื–ืจื™ืžืช ื”ื•ื“ืขื•ืช ืขื‘ื•ืจ ืขืจื›ืช ืฉืงืขื™ื ื•ื”ืขื‘ืจืช ื”ื”ื•ื“ืขื” ื”ืจืืฉื•ื ื” ืžื”ืœืงื•ื— ืœืฉืจืช:

ื”ืขื‘ืจื” ืฉืœ ืžืฉื—ืง ืžืจื•ื‘ื” ืžืฉืชืชืคื™ื ืž-C++ ืœืื™ื ื˜ืจื ื˜ ืขื Cheerp, WebRTC ื•-Firebase
ืชืจืฉื™ื ืฉืœื ืฉืœ ืฉืœื‘ ื”ื—ื™ื‘ื•ืจ ื‘ื™ืŸ ื”ืœืงื•ื— ืœืฉืจืช

ืžืกืงื ื”

ืื ืงืจืืชื ืขื“ ื›ืืŸ, ื›ื ืจืื” ืฉืืชื ืžืขื•ื ื™ื™ื ื™ื ืœืจืื•ืช ืืช ื”ืชื™ืื•ืจื™ื” ื‘ืคืขื•ืœื”. ื ื™ืชืŸ ืœืฉื—ืง ื‘ืžืฉื—ืง teeworlds.leaningtech.com, ื ืกื” ื–ืืช!


ืžืฉื—ืง ื™ื“ื™ื“ื•ืช ื‘ื™ืŸ ืขืžื™ืชื™ื

ืงื•ื“ ืกืคืจื™ื™ืช ื”ืจืฉืช ื–ืžื™ืŸ ื‘ื—ื™ื ื ื‘ื›ืชื•ื‘ืช GitHub. ื”ืฆื˜ืจืคื• ืœืฉื™ื—ื” ื‘ืขืจื•ืฅ ืฉืœื ื• ื‘- ืจืฉืช!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”