Cheerp, WebRTC рдЖрдгрд┐ Firebase рд╕рд╣ C++ рд╡рд░реВрди рд╡реЗрдмрд╡рд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдЕрд░ рдЧреЗрдо рдкреЛрд░реНрдЯ рдХрд░рдгреЗ

рдкрд░рд┐рдЪрдп

рдЖрдордЪреА рдХрдВрдкрдиреА рдЭреБрдХрдгрд╛рд░реЗ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡реЗрдмрд╡рд░ рдкреЛрд░реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрд╛рдп рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдЖрдордЪреЗ C++ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдирдВрджреА WebAssembly рдЖрдгрд┐ JavaScript рдЪреЗ рд╕рдВрдпреЛрдЬрди рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рддреЗ, рдЬреЗ рджреЛрдиреНрд╣реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╕рд╛рдзрд╛ рдмреНрд░рд╛рдЙрдЭрд░ рд╕рдВрд╡рд╛рдж, рдЖрдгрд┐ рдЙрдЪреНрдЪ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛.

рддреНрдпрд╛рдЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рд╡реЗрдмрд╡рд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдЕрд░ рдЧреЗрдо рдкреЛрд░реНрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛ рдЖрдгрд┐ рдирд┐рд╡рдбрд▓рд╛ Teeworlds. Teeworlds рд╣рд╛ рдПрдХ рдорд▓реНрдЯреАрдкреНрд▓реЗрдЕрд░ 2D рд░реЗрдЯреНрд░реЛ рдЧреЗрдо рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рд▓рд╣рд╛рди рдкрдг рд╕рдХреНрд░рд┐рдп рдЦреЗрд│рд╛рдбреВрдВрдЪрд╛ рд╕рдореБрджрд╛рдп рдЖрд╣реЗ (рдорд╛рдЭреНрдпрд╛рд╕рд╣!). рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реЗрд▓реА рд╕рдВрд╕рд╛рдзрдиреЗ рдЖрдгрд┐ CPU рдЖрдгрд┐ GPU рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╛ рджреЛрдиреНрд╣реА рдмрд╛рдмрддреАрдд рддреЗ рд▓рд╣рд╛рди рдЖрд╣реЗ - рдПрдХ рдЖрджрд░реНрд╢ рдЙрдореЗрджрд╡рд╛рд░.

Cheerp, WebRTC рдЖрдгрд┐ Firebase рд╕рд╣ C++ рд╡рд░реВрди рд╡реЗрдмрд╡рд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдЕрд░ рдЧреЗрдо рдкреЛрд░реНрдЯ рдХрд░рдгреЗ
Teeworlds рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЪрд╛рд▓рдд рдЖрд╣реЗ

рдЖрдореНрд╣реА рд╣рд╛ рдкреНрд░рдХрд▓реНрдк рдкреНрд░рдпреЛрдЧ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рдард░рд╡рд▓реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛрдб рд╡реЗрдмрд╡рд░ рдкреЛрд░реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрд╛рдп. рд╣реЗ рд╕рд╣рд╕рд╛ рдЦрд╛рд▓реАрд▓ рдкреНрд░рдХрд╛рд░реЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

  • XMLHttpRequest/fetch, рдЬрд░ рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧрд╛рдордзреНрдпреЗ рдлрдХреНрдд HTTP рд╡рд┐рдирдВрддреНрдпрд╛ рдЕрд╕рддреАрд▓, рдХрд┐рдВрд╡рд╛
  • рд╡реЗрдмрд╕реЙрдХреЗрдЯреНрд╕.

рджреЛрдиреНрд╣реА рд╕реЛрд▓реНрдпреВрд╢рдиреНрд╕рдирд╛ рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рдмрд╛рдЬреВрд▓рд╛ рд╕рд░реНрд╡реНрд╣рд░ рдШрдЯрдХ рд╣реЛрд╕реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рджреЛрдиреНрд╣реАрдкреИрдХреА рдПрдХ рдЯреНрд░рд╛рдиреНрд╕рдкреЛрд░реНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд тАЛтАЛтАЛтАЛрдирд╛рд╣реА. UDP. рд╡реНрд╣рд┐рдбрд┐рдУ рдХреЙрдиреНрдлрд░рдиреНрд╕рд┐рдВрдЧ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдЖрдгрд┐ рдЧреЗрдореНрд╕ рдпрд╛рдВрд╕рд╛рд░рдЦреНрдпрд╛ рд░рд┐рдЕрд▓-рдЯрд╛рдЗрдо рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирд╕рд╛рдареА рд╣реЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ, рдХрд╛рд░рдг рддреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреЕрдХреЗрдЯреНрд╕рдЪреНрдпрд╛ рд╡рд┐рддрд░рдг рдЖрдгрд┐ рдСрд░реНрдбрд░рдЪреА рд╣рдореА рджреЗрддреЗ рдЯреАрд╕реАрдкреА рдХрдореА рд╡рд┐рд▓рдВрдмрд╛рд╕рд╛рдареА рдЕрдбрдерд│рд╛ рд╣реЛрдК рд╢рдХрддреЛ.

рддрд┐рд╕рд░рд╛ рдорд╛рд░реНрдЧ рдЖрд╣реЗ - рдмреНрд░рд╛рдЙрдЭрд░рд╡рд░реВрди рдиреЗрдЯрд╡рд░реНрдХ рд╡рд╛рдкрд░рд╛: WebRTC.

RTCDataChannel рд╣реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЖрдгрд┐ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЕрд╢рд╛ рджреЛрдиреНрд╣реА рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдкреНрд░рд╕рд╛рд░рдгрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрддреЗ (рдирдВрддрд░рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рддреЗ рдЬреЗрд╡реНрд╣рд╛ рд╢рдХреНрдп рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ UDP рдПрдХ рд╡рд╛рд╣рддреВрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЗ) рдЖрдгрд┐ рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╕рд╣ рдЖрдгрд┐ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рджреЛрдиреНрд╣реА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЖрдореНрд╣реА рд╕рд░реНрд╡реНрд╣рд░ рдШрдЯрдХрд╛рд╕рд╣ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмреНрд░рд╛рдЙрдЭрд░рд╡рд░ рдкреЛрд░реНрдЯ рдХрд░реВ рд╢рдХрддреЛ!

рддрдерд╛рдкрд┐, рд╣реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдбрдЪрдг рдШреЗрдКрди рдпреЗрддреЗ: рджреЛрди WebRTC рд╕рд╣рдХрд╛рд▒реНрдпрд╛рдВрдиреА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рдкреВрд░реНрд╡реА, рддреНрдпрд╛рдВрдирд╛ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрд▓рдиреЗрдиреЗ рдЬрдЯрд┐рд▓ рд╣рдБрдбрд╢реЗрдХ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рд╕рдВрд╕реНрдерд╛ (рдПрдХ рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рд╕рд░реНрд╡реНрд╣рд░ рдЖрдгрд┐ рдПрдХ рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ рд╕рд░реНрд╡реНрд╣рд░) рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд STUN/рд╡рд│рдг).

рдЖрджрд░реНрд╢рдкрдгреЗ, рдЖрдореНрд╣реА рдиреЗрдЯрд╡рд░реНрдХ API рддрдпрд╛рд░ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ рдЬреЗ рдЖрдВрддрд░рд┐рдХрд░рд┐рддреНрдпрд╛ WebRTC рд╡рд╛рдкрд░рддреЗ, рдкрд░рдВрддреБ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╕рд▓реЗрд▓реНрдпрд╛ UDP рд╕реЙрдХреЗрдЯреНрд╕ рдЗрдВрдЯрд░рдлреЗрд╕рдЪреНрдпрд╛ рд╢рдХреНрдп рддрд┐рддрдХреНрдпрд╛ рдЬрд╡рд│ рдЖрд╣реЗ.

рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛрдбрдордзреНрдпреЗ рдЬрдЯрд┐рд▓ рддрдкрд╢реАрд▓ рдЙрдШрдб рди рдХрд░рддрд╛ WebRTC рдЪрд╛ рд▓рд╛рдн рдШреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓ (рдЬреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдд рд╢рдХреНрдп рддрд┐рддрдХреЗ рдХрдореА рдХрд░рд╛рдпрдЪреЗ рд╣реЛрддреЗ).

рдХрд┐рдорд╛рди WebRTC

WebRTC рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз API рдЪрд╛ рд╕рдВрдЪ рдЖрд╣реЗ рдЬреЛ рдСрдбрд┐рдУ, рд╡реНрд╣рд┐рдбрд┐рдУ рдЖрдгрд┐ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдбреЗрдЯрд╛рдЪреЗ рдкреАрдЕрд░-рдЯреВ-рдкреАрдЕрд░ рдЯреНрд░рд╛рдиреНрд╕рдорд┐рд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЛ.

ICE рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдпрдВрддреНрд░рдгреЗрджреНрд╡рд╛рд░реЗ STUN рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ рдЯрд░реНрди рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди (рдПрдХ рдХрд┐рдВрд╡рд╛ рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдиреЗ NAT рдЕрд╕рд▓реЗ рддрд░реАрд╣реА) рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдордзреАрд▓ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рд╕рдорд╡рдпрд╕реНрдХ SDP рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдЪреНрдпрд╛ рдСрдлрд░ рдЖрдгрд┐ рдЙрддреНрддрд░рд╛рджреНрд╡рд╛рд░реЗ ICE рдорд╛рд╣рд┐рддреА рдЖрдгрд┐ рдЪреЕрдиреЗрд▓ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рддрд╛рдд.

рд╡реНрд╡рд╛! рдПрдХрд╛ рд╡реЗрд│реА рдХрд┐рддреА рд╕рдВрдХреНрд╖реЗрдк? рдпрд╛ рдЕрдЯреАрдВрдЪрд╛ рдЕрд░реНрде рдХрд╛рдп рдЖрд╣реЗ рддреЗ рдереЛрдбрдХреНрдпрд╛рдд рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдпрд╛:

  • NAT рд╕рд╛рдареА рд╕рддреНрд░ рдЯреНрд░реЕрд╡реНрд╣рд░реНрд╕рд▓ рдпреБрдЯрд┐рд▓рд┐рдЯреАрдЬ (STUN) тАФ NAT рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╣реЛрд╕реНрдЯрд╕рд╣ рдереЗрдЯ рдбреЗрдЯрд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЬреЛрдбреА (IP, рдкреЛрд░реНрдЯ) рдорд┐рд│рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░реЛрдЯреЛрдХреЙрд▓. рдЬрд░ рддреНрдпрд╛рдиреЗ рддреНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рдХреЗрд▓реЗ рддрд░ рддреЛрд▓рд╛рдореЛрд▓рд╛рдЪрд╛ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдПрдХрдореЗрдХрд╛рдВрд╢реА рдбреЗрдЯрд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░реВ рд╢рдХрддреЛ.
  • NAT рдЪреНрдпрд╛ рдЖрд╕рдкрд╛рд╕ рд░рд┐рд▓реЗ рд╡рд╛рдкрд░реВрди рдЯреНрд░реЕрд╡реНрд╣рд░реНрд╕рд▓ (рд╡рд│рдг) NAT рдЯреНрд░реЕрд╡реНрд╣рд░реНрд╕рд▓рд╕рд╛рдареА рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ, рдкрд░рдВрддреБ рддреЗ рдкреНрд░реЙрдХреНрд╕реАрджреНрд╡рд╛рд░реЗ рдбреЗрдЯрд╛ рдлреЙрд░рд╡рд░реНрдб рдХрд░реВрди рд╣реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рдЬреЗ рджреЛрдиреНрд╣реА рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдирд╛ рджреГрд╢реНрдпрдорд╛рди рдЖрд╣реЗ. рд╣реЗ рд╡рд┐рд▓рдВрдм рдЬреЛрдбрддреЗ рдЖрдгрд┐ STUN рдкреЗрдХреНрд╖рд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреЗ рдЕрдзрд┐рдХ рдорд╣рд╛рдЧ рдЖрд╣реЗ (рдХрд╛рд░рдг рддреЗ рд╕рдВрдкреВрд░реНрдг рд╕рдВрдкреНрд░реЗрд╖рдг рд╕рддреНрд░рд╛рдд рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рддреЗ), рдкрд░рдВрддреБ рдХрд╛рд╣реАрд╡реЗрд│рд╛ рддреЛ рдПрдХрдореЗрд╡ рдкрд░реНрдпрд╛рдп рдЕрд╕рддреЛ.
  • рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджреА рдХрдиреЗрдХреНрдЯрд┐рд╡реНрд╣рд┐рдЯреА рд╕реНрдерд╛рдкрдирд╛ (рдмрд░реНрдл) рджреЛрди рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдирд╛ рдереЗрдЯ рдЬреЛрдбрдгреНрдпрд╛рдкрд╛рд╕реВрди рдорд┐рд│рд╛рд▓реЗрд▓реНрдпрд╛ рдорд╛рд╣рд┐рддреАрд╡рд░ рдЖрдзрд╛рд░рд┐рдд, рддрд╕реЗрдЪ рдХрд┐рддреАрд╣реА STUN рдЖрдгрд┐ TURN рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдорд╛рд╣рд┐рддреАрдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рджреЛрди рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдирд╛ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рд╕рд░реНрд╡реЛрддреНрддрдо рдкрджреНрдзрдд рдирд┐рд╡рдбрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ.
  • рд╕рддреНрд░ рд╡рд░реНрдгрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдПрд╕рдбреАрдкреА) рдХрдиреЗрдХреНрд╢рди рдЪреЕрдиреЗрд▓ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕реНрд╡рд░реВрдк рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, ICE рдЙрдореЗрджрд╡рд╛рд░, рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХреЛрдбреЗрдХреНрд╕ (рдСрдбрд┐рдУ/рд╡реНрд╣рд┐рдбрд┐рдУ рдЪреЕрдиреЗрд▓рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд), рдЗ... рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдкреИрдХреА рдПрдХ рдПрд╕рдбреАрдкреА рдСрдлрд░ рдкрд╛рдард╡рддреЛ, рдЖрдгрд┐ рджреБрд╕рд░рд╛ рдПрд╕рдбреАрдкреА рдЙрддреНрддрд░рд╛рд╕рд╣ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрддреЛ . рдпрд╛рдирдВрддрд░, рдПрдХ рдЪреЕрдиреЗрд▓ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рдЕрд╕реЗ рдХрдиреЗрдХреНрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдирд╛ STUN рдЖрдгрд┐ рдЯрд░реНрди рд╕рд░реНрд╡реНрд╣рд░рдХрдбреВрди рдорд┐рд│рд╛рд▓реЗрд▓реА рдорд╛рд╣рд┐рддреА рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдПрдХрдореЗрдХрд╛рдВрд╢реА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рд╕рдорд╕реНрдпрд╛ рдЕрд╢реА рдЖрд╣реЗ рдХреА рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреЗ рдЕрджреНрдпрд╛рдк рдереЗрдЯ рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдпрд╛ рдбреЗрдЯрд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдЙрдЯ-рдСрдл-рдмрдБрдб рдпрдВрддреНрд░рдгрд╛ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: рдПрдХ рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рд╕рд░реНрд╡реНрд╣рд░.

рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рд╕рд░реНрд╡реНрд╣рд░ рдЦреВрдк рд╕реЛрдкрд╛ рдЕрд╕реВ рд╢рдХрддреЛ рдХрд╛рд░рдг рддреНрдпрд╛рдЪреЗ рдПрдХрдореЗрд╡ рдХрд╛рдо рдореНрд╣рдгрдЬреЗ рд╣рдБрдбрд╢реЗрдХ рдЯрдкреНрдкреНрдпрд╛рддреАрд▓ рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдордзреАрд▓ рдбреЗрдЯрд╛ рдлреЙрд░рд╡рд░реНрдб рдХрд░рдгреЗ (рдЦрд╛рд▓реАрд▓ рдЪрд┐рддреНрд░рд╛рдд рджрд░реНрд╢рд╡рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ).

Cheerp, WebRTC рдЖрдгрд┐ Firebase рд╕рд╣ C++ рд╡рд░реВрди рд╡реЗрдмрд╡рд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдЕрд░ рдЧреЗрдо рдкреЛрд░реНрдЯ рдХрд░рдгреЗ
рд╕рд░рд▓реАрдХреГрдд WebRTC рд╣рдБрдбрд╢реЗрдХ рдЕрдиреБрдХреНрд░рдо рдЖрдХреГрддреА

Teeworlds рдиреЗрдЯрд╡рд░реНрдХ рдореЙрдбреЗрд▓ рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди

Teeworlds рдиреЗрдЯрд╡рд░реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЕрддрд┐рд╢рдп рд╕реЛрдкреЗ рдЖрд╣реЗ:

  • рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░ рдШрдЯрдХ рджреЛрди рднрд┐рдиреНрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрд╣реЗрдд.
  • рдХреНрд▓рд╛рдпрдВрдЯ рдЕрдиреЗрдХ рд╕рд░реНрд╡реНрд╣рд░рдкреИрдХреА рдПрдХрд╛рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░реВрди рдЧреЗрдордордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛рдд, рдЬреНрдпрд╛рдкреИрдХреА рдкреНрд░рддреНрдпреЗрдХ рдПрдХрд╛ рд╡реЗрд│реА рдлрдХреНрдд рдПрдХ рдЧреЗрдо рд╣реЛрд╕реНрдЯ рдХрд░рддреЛ.
  • рдЧреЗрдордордзреАрд▓ рд╕рд░реНрд╡ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдиреНрд╕рдлрд░ рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ.
  • рдЧреЗрдо рдХреНрд▓рд╛рдпрдВрдЯрдордзреНрдпреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд░реНрд╡реНрд╣рд░рдЪреА рд╕реВрдЪреА рдЧреЛрд│рд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ.

рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬрд╕рд╛рдареА WebRTC рдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж, рдЖрдореНрд╣реА рдЧреЗрдордЪрд╛ рд╕рд░реНрд╡реНрд╣рд░ рдШрдЯрдХ рдХреНрд▓рд╛рдпрдВрдЯ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдмреНрд░рд╛рдЙрдЭрд░рд╡рд░ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реВ рд╢рдХрддреЛ. рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЙрддреНрддрдо рд╕рдВрдзреА рджреЗрддреЗ...

рд╕рд░реНрд╡реНрд╣рд░рдкрд╛рд╕реВрди рдореБрдХреНрдд рд╡реНрд╣рд╛

рд╕рд░реНрд╡реНрд╣рд░ рд▓реЙрдЬрд┐рдХрдЪреНрдпрд╛ рдХрдорддрд░рддреЗрдЪрд╛ рдПрдХ рдЪрд╛рдВрдЧрд▓рд╛ рдлрд╛рдпрджрд╛ рдЖрд╣реЗ: рдЖрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ Github рдкреГрд╖реНрдард╛рдВрд╡рд░ рдХрд┐рдВрд╡рд╛ рдХреНрд▓рд╛рдЙрдбрдлреНрд▓реЗрдЕрд░рдЪреНрдпрд╛ рдорд╛рдЧреЗ рдЖрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рд╡рд░ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдореНрд╣рдгреВрди рддреИрдирд╛рдд рдХрд░реВ рд╢рдХрддреЛ, рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЬрд▓рдж рдбрд╛рдЙрдирд▓реЛрдб рдЖрдгрд┐ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЙрдЪреНрдЪ рдЕрдкрдЯрд╛рдЗрдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЛ. рдЦрд░рдВ рддрд░, рдЖрдкрдг рддреНрдпрд╛рдВрдЪреНрдпрд╛рдмрджреНрджрд▓ рд╡рд┐рд╕рд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдЬрд░ рдЖрдкрдг рднрд╛рдЧреНрдпрд╡рд╛рди рдЖрд╣реЛрдд рдЖрдгрд┐ рдЦреЗрд│ рд▓реЛрдХрдкреНрд░рд┐рдп рдЭрд╛рд▓рд╛ рддрд░ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреЗ рдЖрдзреБрдирд┐рдХреАрдХрд░рдг рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрдгрд╛рд░ рдирд╛рд╣реА.

рддрдерд╛рдкрд┐, рд╕рд┐рд╕реНрдЯрдо рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрджреНрдпрд╛рдк рдмрд╛рд╣реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡рд╛рдкрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓:

  • рдПрдХ рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ STUN рд╕рд░реНрд╡реНрд╣рд░: рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдирд┐рд╡рдбрдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд.
  • рдХрд┐рдорд╛рди рдПрдХ рдЯрд░реНрди рд╕рд░реНрд╡реНрд╣рд░: рдпреЗрдереЗ рдХреЛрдгрддреЗрд╣реА рд╡рд┐рдирд╛рдореВрд▓реНрдп рдкрд░реНрдпрд╛рдп рдирд╛рд╣реАрдд, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдПрдХрддрд░ рд╕реНрд╡рддрдГрдЪреЗ рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддреЛ рдХрд┐рдВрд╡рд╛ рд╕реЗрд╡реЗрд╕рд╛рдареА рдкреИрд╕реЗ рджреЗрдК рд╢рдХрддреЛ. рд╕реБрджреИрд╡рд╛рдиреЗ, рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рдХрдиреЗрдХреНрд╢рди STUN рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ (рдЖрдгрд┐ рдЦрд░реЗ p2p рдкреНрд░рджрд╛рди рдХрд░рддреЗ), рдкрд░рдВрддреБ рдлреЙрд▓рдмреЕрдХ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгреВрди рдЯрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
  • рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рд╕рд░реНрд╡реНрд╣рд░: рдЗрддрд░ рджреЛрди рдкреИрд▓реВрдВрдкреНрд░рдорд╛рдгреЗ, рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рдкреНрд░рдорд╛рдгрд┐рдд рдирд╛рд╣реА. рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рд╕рд░реНрд╡реНрд╣рд░ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХрд╢рд╛рд╕рд╛рдареА рдЬрдмрд╛рдмрджрд╛рд░ рдЕрд╕реЗрд▓ рд╣реЗ рдХрд╛рд╣реА рдкреНрд░рдорд╛рдгрд╛рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ. рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдереЛрдбреНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдбреЗрдЯрд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
  • Teeworlds Master Server: рд╣реЗ рдЗрддрд░ рд╕рд░реНрд╡реНрд╣рд░ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдЪреА рдЬрд╛рд╣рд┐рд░рд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдХреНрд▓рд╛рдпрдВрдЯрджреНрд╡рд╛рд░реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд░реНрд╡реНрд╣рд░ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ. рд╣реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╕рд▓реЗ рддрд░реА (рдХреНрд▓рд╛рдпрдВрдЯ рдиреЗрд╣рдореА рдореЕрдиреНрдпреБрдЕрд▓реА рдорд╛рд╣рд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░реВ рд╢рдХрддрд╛рдд), рдЦреЗрд│рд╛рдбреВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд▓реЛрдХрд╛рдВрд╕рд╣ рдЧреЗрдордордзреНрдпреЗ рднрд╛рдЧ рдШреЗрдК рд╢рдХрддреАрд▓ рдЕрд╕реЗ рдЕрд╕рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рд╣реЛрдИрд▓.

рдЖрдореНрд╣реА Google рдЪреЗ рдореЛрдлрдд STUN рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛ рдЖрдгрд┐ рдПрдХ рдЯрд░реНрди рд╕рд░реНрд╡реНрд╣рд░ рд╕реНрд╡рддрдГ рддреИрдирд╛рдд рдХреЗрд▓рд╛.

рд╢реЗрд╡рдЯрдЪреЗ рджреЛрди рдореБрджреНрджреЗ рдЖрдореНрд╣реА рд╡рд╛рдкрд░рд▓реЗ рдлрд╛рдпрд░рдмреЗрдЬ:

  • Teeworlds рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рдЕрддрд┐рд╢рдп рд╕реЛрдкреНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ: рдкреНрд░рддреНрдпреЗрдХ рд╕рдХреНрд░рд┐рдп рд╕рд░реНрд╡реНрд╣рд░рдЪреА рдорд╛рд╣рд┐рддреА (рдирд╛рд╡, IP, рдирдХрд╛рд╢рд╛, рдореЛрдб, ...) рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд╕реНрддреВрдВрдЪреА рд╕реВрдЪреА рдореНрд╣рдгреВрди. рд╕рд░реНрд╡реНрд╣рд░ рддреНрдпрд╛рдВрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЖрдгрд┐ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рддрд╛рдд рдЖрдгрд┐ рдХреНрд▓рд╛рдпрдВрдЯ рд╕рдВрдкреВрд░реНрдг рдпрд╛рджреА рдШреЗрддрд╛рдд рдЖрдгрд┐ рдкреНрд▓реЗрдЕрд░рд▓рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛рдд. рдЖрдореНрд╣реА рдореБрдЦреНрдпрдкреГрд╖реНрдард╛рд╡рд░ HTML рдореНрд╣рдгреВрди рд╕реВрдЪреА рджреЗрдЦреАрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЛ рдЬреЗрдгреЗрдХрд░реВрди рдЦреЗрд│рд╛рдбреВ рдлрдХреНрдд рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░реВ рд╢рдХрддреАрд▓ рдЖрдгрд┐ рдереЗрдЯ рдЧреЗрдордордзреНрдпреЗ рдиреЗрд▓реЗ рдЬрд╛рддреАрд▓.
  • рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рдЖрдордЪреНрдпрд╛ рд╕реЙрдХреЗрдЯреНрд╕рдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╢реА рдЬрд╡рд│реВрди рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ, рдкреБрдвреАрд▓ рд╡рд┐рднрд╛рдЧрд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ.

Cheerp, WebRTC рдЖрдгрд┐ Firebase рд╕рд╣ C++ рд╡рд░реВрди рд╡реЗрдмрд╡рд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдЕрд░ рдЧреЗрдо рдкреЛрд░реНрдЯ рдХрд░рдгреЗ
рдЧреЗрдордордзреАрд▓ рдЖрдгрд┐ рдореБрдЦреНрдпрдкреГрд╖реНрдард╛рд╡рд░реАрд▓ рд╕рд░реНрд╡реНрд╣рд░рдЪреА рд╕реВрдЪреА

рд╕реЙрдХреЗрдЯреНрд╕рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Posix UDP рд╕реЙрдХреЗрдЯреНрд╕рдЪреНрдпрд╛ рд╢рдХреНрдп рддрд┐рддрдХреНрдпрд╛ рдЬрд╡рд│ рдЕрд╕рд▓реЗрд▓реЗ API рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ.

рдЖрдореНрд╣реА рдиреЗрдЯрд╡рд░реНрдХрд╡рд░ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреНрдпрд╛ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬрд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдХрд┐рдорд╛рди рдЖрд╡рд╢реНрдпрдХ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рджреЗрдЦреАрд▓ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ.

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд╛рдЙрдЯрд┐рдВрдЧрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА: рд╕рд░реНрд╡ рд╕рдорд╡рдпрд╕реНрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╛рдпрд░рдмреЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрджрд╛рд╣рд░рдгрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╛рди "рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ LAN" рд╡рд░ рдЖрд╣реЗрдд.

рдореНрд╣рдгреВрди, рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрджреНрд╡рд┐рддреАрдп IP рдкрддреНрддреНрдпрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА: рдЕрджреНрд╡рд┐рддреАрдп рдлрд╛рдпрд░рдмреЗрд╕ рдХреА рдореВрд▓реНрдпреЗ (рдбреЛрдореЗрди рдирд╛рд╡рд╛рдВрд╕рд╛рд░рдЦреА) рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдирд╛ рдЕрдирдиреНрдпрдкрдгреЗ рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдкреБрд░реЗрд╢реА рдЖрд╣реЗрдд рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреАрдЕрд░ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреАрд▓рд╛ рд╕реНрдерд╛рдирд┐рдХрд░рд┐рддреНрдпрд╛ "рдмрдирд╛рд╡рдЯ" 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 рдкрддреНрддреЗ рдирд╕реВрди рдлрд╛рдпрд░рдмреЗрд╕ рдХреА рдЖрд╣реЗрдд (рддреНрдпрд╛ рдЕрд╢рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрд╣реЗрдд: -LmEC50PYZLCiCP-vqde ).

рд╣реЗ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрд╣реЗ рдХрд╛рд░рдг рдЖрдореНрд╣рд╛рд▓рд╛ IP рдирд┐рдпреБрдХреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА (рддрд╕реЗрдЪ рдХреНрд▓рд╛рдпрдВрдЯ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░ рддреНрдпрд╛рдВрдЪреА рд╡рд┐рд▓реНрд╣реЗрд╡рд╛рдЯ рд▓рд╛рд╡рдгреНрдпрд╛рд╕рд╛рдареА) рдпрдВрддреНрд░рдгреЗрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА, рдкрд░рдВрддреБ рд╕рд╣рд╕рд╛ рдЕрдВрдХреАрдп рдореВрд▓реНрдпрд╛рдиреБрд╕рд╛рд░ рд╕рдорд╡рдпрд╕реНрдХ рдУрд│рдЦрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ.

рдлрдВрдХреНрд╢рдиреНрд╕рд╕рд╛рдареА рдиреЗрдордХреЗ рд╣реЗрдЪ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ. resolve ╨╕ reverseResolve: рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ рдХреАрдЪреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореВрд▓реНрдп (рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЗрдирдкреБрдЯрджреНрд╡рд╛рд░реЗ рдХрд┐рдВрд╡рд╛ рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ) рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рдЖрдгрд┐ рддреЗ рдЕрдВрддрд░реНрдЧрдд рд╡рд╛рдкрд░рд╛рд╕рд╛рдареА IP рдкрддреНрддреНрдпрд╛рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реВ рд╢рдХрддреЗ. рдЙрд░реНрд╡рд░рд┐рдд API рджреЗрдЦреАрд▓ рд╕рд╛рдзреЗрдкрдгрд╛рд╕рд╛рдареА рд╕реНрдЯреНрд░рд┐рдВрдЧрдРрд╡рдЬреА рд╣реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛рдд.

рд╣реЗ DNS рд▓реБрдХрдЕрдкрд╕рд╛рд░рдЦреЗрдЪ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдХреНрд▓рд╛рдпрдВрдЯрд╡рд░ рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

рдореНрд╣рдгрдЬреЗрдЪ, IP рдкрддреНрддреЗ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдХреНрд▓рд╛рдпрдВрдЯрдордзреНрдпреЗ рд╕рд╛рдорд╛рдпрд┐рдХ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реАрдд рдЖрдгрд┐ рдЬрд░ рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪреЗ рдЧреНрд▓реЛрдмрд▓ рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓ рддрд░ рддреЗ рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓.

рдЖрд│рд╢реА рдХрдиреЗрдХреНрд╢рди

UDP рд▓рд╛ рдХрдиреЗрдХреНрд╢рдирдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рдкрд╛рд╣рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, WebRTC рд▓рд╛ рджреЛрди рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрдордзреНрдпреЗ рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдПрдХ рд▓рд╛рдВрдм рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рдорд╛рди рдкрд╛рддрд│реАрдЪреЗ рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, (sendto/recvfrom рдкреВрд░реНрд╡ рдХрдиреЗрдХреНрд╢рдирд╢рд┐рд╡рд╛рдп рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕рдорд╡рдпрд╕реНрдХрд╛рдВрд╕рд╣), рдирдВрддрд░ рддреНрдпрд╛рдВрдиреА API рдордзреНрдпреЗ "рдЖрд│рд╢реА" (рд╡рд┐рд▓рдВрдмрд┐рдд) рдХрдиреЗрдХреНрд╢рди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

UDP рд╡рд╛рдкрд░рддрд╛рдирд╛ "рд╕рд░реНрд╡реНрд╣рд░" рдЖрдгрд┐ "рдХреНрд▓рд╛рдпрдВрдЯ" рдпрд╛рдВрдЪреНрдпрд╛рддреАрд▓ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкреНрд░реЗрд╖рдгрд╛рджрд░рдореНрдпрд╛рди рдЕрд╕реЗ рдШрдбрддреЗ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ рд▓рд╛рдпрдмреНрд░рд░реАрдиреЗ рдХрд╛рдп рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ:

  • рд╕рд░реНрд╡реНрд╣рд░ рдХреЙрд▓ bind()рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯреАрдорд▓рд╛ рд╕рд╛рдВрдЧрдгреНрдпрд╛рд╕рд╛рдареА рдХреА рддреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯрд╡рд░ рдкреЕрдХреЗрдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдЖрд╣реЗ.

рддреНрдпрд╛рдРрд╡рдЬреА, рдЖрдореНрд╣реА рд╕рд░реНрд╡реНрд╣рд░ рдХреА рдЕрдВрддрд░реНрдЧрдд рдлрд╛рдпрд░рдмреЗрд╕рд╡рд░ рдПрдХ рдУрдкрди рдкреЛрд░реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рдмрдЯреНрд░реАрдордзреАрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдРрдХреВ.

  • рд╕рд░реНрд╡реНрд╣рд░ рдХреЙрд▓ recvfrom(), рдпрд╛ рдкреЛрд░реНрдЯрд╡рд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╣реЛрд╕реНрдЯрдХрдбреВрди рдпреЗрдгрд╛рд░реА рдкреЕрдХреЗрдЯ рд╕реНрд╡реАрдХрд╛рд░рдгреЗ.

рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЖрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдкреЛрд░реНрдЯрд╡рд░ рдкрд╛рдард╡рд▓реЗрд▓реНрдпрд╛ рдкреЕрдХреЗрдЯрдЪреА рдпреЗрдгрд╛рд░реА рд░рд╛рдВрдЧ рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ.

рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд░реНрдЯрдЪреА рд╕реНрд╡рддрдГрдЪреА рд░рд╛рдВрдЧ рдЕрд╕рддреЗ рдЖрдгрд┐ рдЖрдореНрд╣реА WebRTC рдбреЗрдЯрд╛рдЧреНрд░рд╛рдордЪреНрдпрд╛ рд╕реБрд░реВрд╡рд╛рддреАрд╕ рд╕реНрддреНрд░реЛрдд рдЖрдгрд┐ рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯ рдЬреЛрдбрддреЛ рдЬреЗрдгреЗрдХрд░реВрди рдирд╡реАрди рдкреЕрдХреЗрдЯ рдЖрд▓реНрдпрд╛рд╡рд░ рдХреЛрдгрддреНрдпрд╛ рд░рд╛рдВрдЧреЗрд▓рд╛ рдлреЙрд░рд╡рд░реНрдб рдХрд░рд╛рдпрдЪреЗ рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд│реЗрд▓.

рдХреЙрд▓ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдкреЕрдХреЗрдЯ рдирд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдлрдХреНрдд -1 рдкрд░рдд рдХрд░рддреЛ рдЖрдгрд┐ рд╕реЗрдЯ рдХрд░рддреЛ errno=EWOULDBLOCK.

  • рдХреНрд▓рд╛рдпрдВрдЯрд▓рд╛ рд╕рд░реНрд╡реНрд╣рд░рдЪрд╛ IP рдЖрдгрд┐ рдкреЛрд░реНрдЯ рдХрд╛рд╣реА рдмрд╛рд╣реНрдп рдорд╛рд░реНрдЧрд╛рдВрдиреА рдЖрдгрд┐ рдХреЙрд▓реНрд╕рджреНрд╡рд╛рд░реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЛ sendto(). рд╣реЗ рдЕрдВрддрд░реНрдЧрдд рдХреЙрд▓ рджреЗрдЦреАрд▓ рдХрд░рддреЗ. bind(), рдореНрд╣рдгреВрди рддреНрдпрд╛рдирдВрддрд░рдЪреЗ recvfrom() рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдмрдВрдзрдиреЗ рди рдЪрд╛рд▓рд╡рддрд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓.

рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдХреНрд▓рд╛рдпрдВрдЯ рдмрд╛рд╣реНрдпрд░рд┐рддреНрдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЛ рдЖрдгрд┐ рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рддреЛ resolve() IP рдкрддреНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░, рджреЛрди рд╕рдорд╡рдпрд╕реНрдХ рдЕрджреНрдпрд╛рдк рдПрдХрдореЗрдХрд╛рдВрд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдирд╕рд▓реНрдпрд╛рд╕ рдЖрдореНрд╣реА WebRTC рд╣рдБрдбрд╢реЗрдХ рд╕реБрд░реВ рдХрд░рддреЛ. рдПрдХрд╛рдЪ рдкреАрдЕрд░рдЪреНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреЛрд░реНрдЯрд╢реА рдХрдиреЗрдХреНрд╢рди рд╕рдорд╛рди WebRTC рдбреЗрдЯрд╛ рдЪреЕрдиреЗрд▓ рд╡рд╛рдкрд░рддрд╛рдд.

рдЖрдореНрд╣реА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдордЧрд┐рд░реА рджреЗрдЦреАрд▓ рдХрд░рддреЛ bind()рдЬреЗрдгреЗрдХрд░реВрди рд╕рд░реНрд╡реНрд╣рд░ рдкреБрдвреАрд▓рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рдХрдиреЗрдХреНрдЯ рд╣реЛрдК рд╢рдХреЗрд▓ sendto() рдХрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕реНрддрд╡ рдмрдВрдж рдЭрд╛рд▓реНрдпрд╛рд╕.

рдЬреЗрд╡реНрд╣рд╛ рдХреНрд▓рд╛рдпрдВрдЯ рддреНрдпрд╛рдЪреА SDP рдСрдлрд░ рдлрд╛рдпрд░рдмреЗрд╕рдордзреНрдпреЗ рд╕рд░реНрд╡реНрд╣рд░ рдкреЛрд░реНрдЯ рдорд╛рд╣рд┐рддреАрдЪреНрдпрд╛ рдЦрд╛рд▓реА рд▓рд┐рд╣рд┐рддреЛ рддреЗрд╡реНрд╣рд╛ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдХреНрд▓рд╛рдпрдВрдЯрдЪреНрдпрд╛ рдХрдиреЗрдХреНрд╢рдирдмрджреНрджрд▓ рд╕реВрдЪрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░ рддреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рд╕рд╣ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрддреЛ.

рдЦрд╛рд▓реАрд▓ рдЖрдХреГрддреА рд╕реЙрдХреЗрдЯ рдпреЛрдЬрдиреЗрд╕рд╛рдареА рд╕рдВрджреЗрд╢ рдкреНрд░рд╡рд╛рд╣ рдЖрдгрд┐ рдХреНрд▓рд╛рдпрдВрдЯрдХрдбреВрди рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкрд╣рд┐рд▓рд╛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рджрд░реНрд╢рд╡рд┐рддреЗ:

Cheerp, WebRTC рдЖрдгрд┐ Firebase рд╕рд╣ C++ рд╡рд░реВрди рд╡реЗрдмрд╡рд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдЕрд░ рдЧреЗрдо рдкреЛрд░реНрдЯ рдХрд░рдгреЗ
рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рдордзреАрд▓ рдХрдиреЗрдХреНрд╢рди рдЯрдкреНрдкреНрдпрд╛рдЪреЗ рдкреВрд░реНрдг рдЖрдХреГрддреА

рдирд┐рд╖реНрдХрд░реНрд╖

рддреБрдореНрд╣реА рдЖрддрд╛рдкрд░реНрдпрдВрдд рд╡рд╛рдЪрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рдХрджрд╛рдЪрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХреГрддреАрдд рдкрд╛рд╣рдгреНрдпрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕реЗрд▓. рд╡рд░ рдЦреЗрд│ рдЦреЗрд│рддрд╛ рдпреЗрддреЛ teeworlds.leaningtech.com, рд╣реЗ рдХрд░реВрди рдкрд╣рд╛!


рд╕рд╣рдХрд╛рд▒реНрдпрд╛рдВрдордзреАрд▓ рдореИрддреНрд░реАрдкреВрд░реНрдг рд╕рд╛рдордирд╛

рдиреЗрдЯрд╡рд░реНрдХ рд▓рд╛рдпрдмреНрд░рд░реА рдХреЛрдб рдпреЗрдереЗ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ рдЬрд┐рдереВрдм. рдпреЗрдереЗ рдЖрдордЪреНрдпрд╛ рдЪреЕрдиреЗрд▓рд╡рд░реАрд▓ рд╕рдВрднрд╛рд╖рдгрд╛рдд рд╕рд╛рдореАрд▓ рд╡реНрд╣рд╛ рдЬрд┐рдЯрд░!

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛