Cheerp, WebRTC рд░ Firebase рд╕рдБрдЧ C++ рдмрд╛рдЯ рд╡реЗрдмрдорд╛ рдорд▓реНрдЯрд┐рдкреНрд▓реЗрдпрд░ рдЦреЗрд▓ рдкреЛрд░реНрдЯ рдЧрд░реНрджреИ

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

рд╣рд╛рдореНрд░реЛ рдХрдореНрдкрдиреА рдЭреБрдХрд╛рд╡ рдЯреЗрдХреНрдиреЛрд▓реЛрдЬреАрд╣рд░реВ рд╡реЗрдмрдорд╛ рдкрд░рдореНрдкрд░рд╛рдЧрдд рдбреЗрд╕реНрдХрдЯрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдкреЛрд░реНрдЯ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рд╣рд╛рдореНрд░реЛ C++ рдХрдореНрдкрд╛рдЗрд▓рд░ рдЦреБрд╢реА WebAssembly рд░ JavaScript рдХреЛ рд╕рдВрдпреЛрдЬрди рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ, рдЬрд╕рд▓реЗ рджреБрдмреИ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ рд╕рд░рд▓ рдмреНрд░рд╛рдЙрдЬрд░ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рдиред

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

Cheerp, WebRTC рд░ Firebase рд╕рдБрдЧ C++ рдмрд╛рдЯ рд╡реЗрдмрдорд╛ рдорд▓реНрдЯрд┐рдкреНрд▓реЗрдпрд░ рдЦреЗрд▓ рдкреЛрд░реНрдЯ рдЧрд░реНрджреИ
Teeworlds рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ

рд╣рд╛рдореАрд▓реЗ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ рд╡реЗрдмрдорд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛрдб рдкреЛрд░реНрдЯ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рдирд╣рд░реВред рдпреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдирд┐рдореНрди рддрд░рд┐рдХрд╛рдорд╛ рдЧрд░рд┐рдиреНрдЫ:

  • XMLHttpRequest/ftch, рдпрджрд┐ рд╕рдЮреНрдЬрд╛рд▓ рднрд╛рдЧрдорд╛ HTTP рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдорд╛рддреНрд░ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреНрдЫрдиреН, рд╡рд╛
  • рд╡реЗрдмрд╕реЛрдХреЗрдЯрд╣рд░реВ.

рджреБрдмреИ рд╕рдорд╛рдзрд╛рдирд╣рд░реВрд▓рд╛рдИ рд╕рд░реНрднрд░ рд╕рд╛рдЗрдбрдорд╛ рд╕рд░реНрднрд░ рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рд╣реЛрд╕реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рди рдд рдпрд╛рддрд╛рдпрд╛рдд рдкреНрд░реЛрдЯреЛрдХрд▓рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред UDPред рдпреЛ рднрд┐рдбрд┐рдпреЛ рдХрдиреНрдлрд░реЗрдиреНрд╕рд┐рдЩ рд╕рдлреНрдЯрд╡реЗрдпрд░ рд░ рдЦреЗрд▓рд╣рд░реВ рдЬрд╕реНрддрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╕рдордп рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ, рдХрд┐рдирдХрд┐ рдпрд╕рд▓реЗ рдкреНрд░реЛрдЯреЛрдХрд▓ рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВрдХреЛ рдбреЗрд▓рд┐рднрд░реА рд░ рдЕрд░реНрдбрд░рдХреЛ рдЧреНрдпрд╛рд░реЗрдиреНрдЯреА рджрд┐рдиреНрдЫред рдЯреАрд╕реАрдкреА рдХрдо рд╡рд┐рд▓рдореНрдмрддрд╛рдорд╛ рдмрд╛рдзрд╛ рд╣реБрди рд╕рдХреНрдЫред

рддреНрдпрд╣рд╛рдБ рддреЗрд╕реНрд░реЛ рддрд░рд┐рдХрд╛ рдЫ - рдмреНрд░рд╛рдЙрдЬрд░рдмрд╛рдЯ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН: WebRTC.

RTCDataChannel рдпрд╕рд▓реЗ рднрд░рдкрд░реНрджреЛ рд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░рд╕рд╛рд░рдгрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ (рдкрдЫрд┐рд▓реНрд▓реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпрд╕рд▓реЗ UDP рд▓рд╛рдИ рдпрд╛рддрд╛рдпрд╛рдд рдкреНрд░реЛрдЯреЛрдХрд▓рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрдЫ рдЬрдм рд╕рдореНрднрд╡ рд╣реБрдиреНрдЫ), рд░ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░ рд░ рдмреНрд░рд╛рдЙрдЬрд░рд╣рд░реВ рдмреАрдЪ рджреБрд╡реИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрд╕рдХреЛ рдорддрд▓рдм рд╣рд╛рдореА рд╕рд░реНрднрд░ рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рд╕рд╣рд┐рдд рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рд╕рдореНрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреЛрд░реНрдЯ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ!

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

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

рдпрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдХреЛрдбрдорд╛ рдЬрдЯрд┐рд▓ рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдЦреБрд▓рд╛рд╕рд╛ рдирдЧрд░реАрдХрди WebRTC рдХреЛ рдлрд╛рдЗрджрд╛ рд▓рд┐рди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫ (рдЬрд╕рд▓рд╛рдИ рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрд╕рдХреЗрд╕рдореНрдо рдереЛрд░реИ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдереНрдпреМрдВ)ред

рдиреНрдпреВрдирддрдо WebRTC

WebRTC рдмреНрд░рд╛рдЙрдЬрд░рд╣рд░реВрдорд╛ рдЙрдкрд▓рдмреНрдз API рд╣рд░реВрдХреЛ рд╕реЗрдЯ рд╣реЛ рдЬрд╕рд▓реЗ рдЕрдбрд┐рдпреЛ, рднрд┐рдбрд┐рдпреЛ рд░ рдордирдорд╛рдиреА рдбреЗрдЯрд╛рдХреЛ рдкрд┐рдпрд░-рдЯреВ-рдкреАрдпрд░ рдкреНрд░рд╕рд╛рд░рдг рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред

ICE рднрдирд┐рдиреЗ рдореЗрдХрд╛рдирд┐рдЬрдо рдорд╛рд░реНрдлрдд STUN рд░/рд╡рд╛ рдЯрд░реНрди рд╕рд░реНрднрд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд╛рдереАрд╣рд░реВ рдмреАрдЪрдХреЛ рдЬрдбрд╛рди рд╕реНрдерд╛рдкрд┐рдд рд╣реБрдиреНрдЫ (рдПрдЙрдЯрд╛ рд╡рд╛ рджреБрд╡реИрддрд┐рд░ NAT рднрдП рдкрдирд┐)ред рд╕рд╛рдереАрд╣рд░реВрд▓реЗ SDP рдкреНрд░реЛрдЯреЛрдХрд▓рдХреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░ рдЬрд╡рд╛рдл рдорд╛рд░реНрдлрдд ICE рдЬрд╛рдирдХрд╛рд░реА рд░ рдЪреНрдпрд╛рдирд▓ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдЖрджрд╛рдирдкреНрд░рджрд╛рди рдЧрд░реНрдЫрдиреНред

рд╡рд╛рд╣! рдПрдХ рдкрдЯрдХрдорд╛ рдХрддрд┐рд╡рдЯрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкрд╣рд░реВ? рдпреА рд╕рд░реНрддрд╣рд░реВрдХреЛ рдЕрд░реНрде рдХреЗ рд╣реЛ рднрдиреЗрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкрдорд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░реМрдВ:

  • NAT рдХреЛ рд▓рд╛рдЧрд┐ рд╕рддреНрд░ рдЯреНрд░рд╛рднрд░реНрд╕рд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ (STUN) - NAT рд▓рд╛рдИ рдмрд╛рдЗрдкрд╛рд╕ рдЧрд░реНрди рд░ рд╣реЛрд╕реНрдЯрд╕рдБрдЧ рд╕реАрдзрд╛ рдбрд╛рдЯрд╛ рдЖрджрд╛рдирдкреНрд░рджрд╛рди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЬреЛрдбреА (IP, рдкреЛрд░реНрдЯ) рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░реЛрдЯреЛрдХрд▓ред рдпрджрд┐ рдЙрд╕рд▓реЗ рдЖрдлреНрдиреЛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдЧрд░реНрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрдЫ рднрдиреЗ, рд╕рд╛рдереАрд╣рд░реВрд▓реЗ рд╕реНрд╡рддрдиреНрддреНрд░ рд░реВрдкрдорд╛ рдПрдХрдЕрд░реНрдХрд╛рд╕рдБрдЧ рдбрд╛рдЯрд╛ рдЖрджрд╛рдирдкреНрд░рджрд╛рди рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред
  • NAT рд╡рд░рд┐рдкрд░рд┐ рд░рд┐рд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЯреНрд░реНрдпрд╛рднрд░реНрд╕рд▓ (рдЯрд░реНрди) NAT рдЯреНрд░рд╛рднрд░реНрд╕рд▓рдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рддрд░ рдпрд╕рд▓реЗ рджреБрд╡реИ рд╕рд╛рдереАрд╣рд░реВрд▓рд╛рдИ рджреЗрдЦреНрди рд╕рдХреНрдиреЗ рдкреНрд░реЛрдХреНрд╕реА рдорд╛рд░реНрдлрдд рдбреЗрдЯрд╛ рдлрд░реНрд╡рд╛рд░реНрдб рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рдпрд╕рд▓реЗ рд╡рд┐рд▓рдореНрдмрддрд╛ рдердкреНрдЫ рд░ STUN рднрдиреНрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдорд╣рдБрдЧреЛ рдЫ (рдХрд┐рдирдХрд┐ рдпреЛ рд╕рдореНрдкреВрд░реНрдг рд╕рдЮреНрдЪрд╛рд░ рд╕рддреНрд░рдорд╛ рд▓рд╛рдЧреВ рд╣реБрдиреНрдЫ), рддрд░ рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдпреЛ рдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛред
  • рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕реНрдерд╛рдкрдирд╛ (ICE) рд╕рд┐рдзреИ рдЬрдбрд╛рди рдЧрд░реНрдиреЗ рд╕рд╛рдереАрд╣рд░реВрдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА, рд╕рд╛рдереИ STUN рд░ рдЯрд░реНрди рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рдХреБрдиреИ рдкрдирд┐ рд╕рдВрдЦреНрдпрд╛рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдЖрдзрд╛рд░рдорд╛ рджреБрдИ рд╕рд╛рдереАрд╣рд░реВрд▓рд╛рдИ рдЬрдбрд╛рди рдЧрд░реНрдиреЗ рдЙрддреНрддрдо рд╕рдореНрднрд╛рд╡рд┐рдд рд╡рд┐рдзрд┐ рдЪрдпрди рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред
  • рд╕рддреНрд░ рд╡рд┐рд╡рд░рдг рдкреНрд░реЛрдЯреЛрдХрд▓ (рдПрд╕рдбреАрдкреА) рдЬрдбрд╛рди рдЪреНрдпрд╛рдирд▓ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗ рдврд╛рдБрдЪрд╛ рд╣реЛ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, ICE рдЙрдореНрдореЗрджреНрд╡рд╛рд░рд╣рд░реВ, рдорд▓реНрдЯрд┐рдорд┐рдбрд┐рдпрд╛ рдХреЛрдбреЗрдХрд╣рд░реВ (рдЕрдбрд┐рдпреЛ/рднрд┐рдбрд┐рдпреЛ рдЪреНрдпрд╛рдирд▓рдХреЛ рдорд╛рдорд▓рд╛рдорд╛), рдЖрджрд┐... рд╕рд╛рдереАрд╣рд░реВ рдордзреНрдпреЗ рдПрдХрд▓реЗ SDP рдкреНрд░рд╕реНрддрд╛рд╡ рдкрдард╛рдЙрдБрдЫ, рд░ рджреЛрд╕реНрд░реЛрд▓реЗ SDP рдЬрд╡рд╛рдлрдХреЛ рд╕рд╛рде рдЬрд╡рд╛рдл рджрд┐рдиреНрдЫред ред рдпрд╕ рдкрдЫрд┐, рдПрдХ рдЪреНрдпрд╛рдирд▓ рдмрдирд╛рдЗрдиреНрдЫред

рдпрд╕реНрддреЛ рдЬрдбрд╛рди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди, рд╕рд╛рдереАрд╣рд░реВрд▓реЗ STUN рд░ рдЯрд░реНрди рд╕рд░реНрднрд░рд╣рд░реВрдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рд░ рдПрдХрдЕрд░реНрдХрд╛рд╕рдБрдЧ рдЖрджрд╛рди рдкреНрд░рджрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рд╕рдорд╕реНрдпрд╛ рдпреЛ рд╣реЛ рдХрд┐ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рд╕рд┐рдзреИ рд╕рдЮреНрдЪрд╛рд░ рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдЫреИрди, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдбреЗрдЯрд╛ рд╕рд╛рдЯрд╛рд╕рд╛рдЯ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдмрд╛рд╣рд┐рд░рдХреЛ рдмреНрдпрд╛рдиреНрдб рдореЗрдХрд╛рдирд┐рдЬрдо рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрдиреБрдкрд░реНрдЫ: рдПрдХ рд╕рд┐рдЧреНрдирд▓рд┐рдЩ рд╕рд░реНрднрд░ред

рдПрдХ рд╕рд┐рдЧреНрдирд▓рд┐рдЩ рд╕рд░реНрднрд░ рдзреЗрд░реИ рд╕рд░рд▓ рд╣реБрди рд╕рдХреНрдЫ рдХрд┐рдирднрдиреЗ рдпрд╕рдХреЛ рдорд╛рддреНрд░ рдХрд╛рдо рд╣реНрдпрд╛рдиреНрдбрд╢реЗрдХ рдЪрд░рдгрдорд╛ рд╕рд╛рдереАрд╣рд░реВ рдмреАрдЪ рдбреЗрдЯрд╛ рдлрд░реНрд╡рд╛рд░реНрдб рдЧрд░реНрдиреБ рд╣реЛ (рддрд▓рдХреЛ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░рдорд╛ рджреЗрдЦрд╛рдЗрдПрдХреЛ рдЫ)ред

Cheerp, WebRTC рд░ Firebase рд╕рдБрдЧ C++ рдмрд╛рдЯ рд╡реЗрдмрдорд╛ рдорд▓реНрдЯрд┐рдкреНрд▓реЗрдпрд░ рдЦреЗрд▓ рдкреЛрд░реНрдЯ рдЧрд░реНрджреИ
рд╕рд░рд▓реАрдХреГрдд WebRTC рд╣реНрдпрд╛рдиреНрдбрд╢реЗрдХ рдЕрдиреБрдХреНрд░рдо рд░реЗрдЦрд╛рдЪрд┐рддреНрд░

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

Teeworlds рдиреЗрдЯрд╡рд░реНрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдзреЗрд░реИ рд╕рд░рд▓ рдЫ:

  • рдЧреНрд░рд╛рд╣рдХ рд░ рд╕рд░реНрднрд░ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рджреБрдИ рдлрд░рдХ рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рд╣реБрдиреНред
  • рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрд▓реЗ рдзреЗрд░реИ рд╕рд░реНрднрд░рд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛рдорд╛ рдЬрдбрд╛рди рдЧрд░реЗрд░ рдЦреЗрд▓рдорд╛ рдкреНрд░рд╡реЗрд╢ рдЧрд░реНрдЫрдиреН, рдЬрд╕рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХрд▓реЗ рдПрдХ рдкрдЯрдХрдорд╛ рдПрдЙрдЯрд╛ рдорд╛рддреНрд░ рдЦреЗрд▓ рд╣реЛрд╕реНрдЯ рдЧрд░реНрджрдЫред
  • рдЦреЗрд▓ рдорд╛ рд╕рдмреИ рдбрд╛рдЯрд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд╕рд░реНрднрд░ рдорд╛рд░реНрдлрдд рдЧрд░рд┐рдиреНрдЫред
  • рдЦреЗрд▓ рдХреНрд▓рд╛рдЗрдиреНрдЯрдорд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдиреЗ рд╕рдмреИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рд╕реВрдЪреА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рд╡рд┐рд╢реЗрд╖ рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

рдбрд╛рдЯрд╛ рдПрдХреНрд╕рдЪреЗрдиреНрдЬрдХреЛ рд▓рд╛рдЧрд┐ WebRTC рдХреЛ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж, рд╣рд╛рдореА рдХреНрд▓рд╛рдЗрдиреНрдЯ рдЕрд╡рд╕реНрдерд┐рдд рднрдПрдХреЛ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдЦреЗрд▓рдХреЛ рд╕рд░реНрднрд░ рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рдпрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдареВрд▓реЛ рдЕрд╡рд╕рд░ рджрд┐рдиреНрдЫ ...

рд╕рд░реНрднрд░рдмрд╛рдЯ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдЙрдиреБрд╣реЛрд╕реН

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

рдпрджреНрдпрдкрд┐, рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдЕрдЭреИ рдкрдирд┐ рдмрд╛рд╣реНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдкрд░реНрдЫ:

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

рд╣рд╛рдореАрд▓реЗ рдЧреБрдЧрд▓рдХреЛ рдирд┐:рд╢реБрд▓реНрдХ STUN рд╕рд░реНрднрд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ, рд░ рдЖрдлреИрдВрд▓реЗ рдПрдЙрдЯрд╛ рдЯрд░реНрди рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНтАНрдпреМрдВред

рдЕрдиреНрддрд┐рдо рджреБрдИ рдЕрдВрдХрдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдпреМрдВ Firebase:

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

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

рд╕рдХреЗрдЯ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рд╣рд╛рдореА рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдХрдо рдЧрд░реНрди рд╕рдореНрднрд╡ рднрдПрд╕рдореНрдо Posix UDP рд╕рдХреЗрдЯрдХреЛ рдирдЬрд┐рдХ рднрдПрдХреЛ API рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред

рд╣рд╛рдореА рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рд╕рд░рд▓ рдбрд╛рдЯрд╛ рдЖрджрд╛рдирдкреНрд░рджрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред

рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓рд╛рдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд╛рдЙрдЯрд┐рдЩрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди: рд╕рдмреИ рд╕рд╛рдереАрд╣рд░реВ рдПрдЙрдЯреИ "рднрд░реНрдЪреБрдЕрд▓ рд▓реНрдпрд╛рди" рдорд╛ рдЫрдиреН рдЬреБрди рдлрд╛рдпрд░рдмреЗрд╕ рдбрд╛рдЯрд╛рдмреЗрд╕ рдЙрджрд╛рд╣рд░рдгрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫред

рддреНрдпрд╕рдХрд╛рд░рдг, рд╣рд╛рдореАрд▓рд╛рдИ рдЕрджреНрд╡рд┐рддреАрдп 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 рд╕рдХреЗрдЯ API рдЬрд╕реНрддреИ рдЫ, рддрд░ рдХреЗрд╣рд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рднрд┐рдиреНрдирддрд╛рд╣рд░реВ рдЫрдиреН: рдХрд▓рдмреНрдпрд╛рдХ рд▓рдЧрд┐рдЩ, рд╕реНрдерд╛рдиреАрдп рдЖрдИрдкреА рддреЛрдХреНрдиреЗ, рд░ рдЕрд▓реНрдЫреА рдЬрдбрд╛рдирд╣рд░реВ.

рдХрд▓рдмреНрдпрд╛рдХрд╣рд░реВ рджрд░реНрддрд╛ рдЧрд░реНрджреИ

рдореМрд▓рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдорд▓реЗ рдЧреИрд░-рдмреНрд▓рдХрд┐рдЩ I/O рдкреНрд░рдпреЛрдЧ рдЧрд░реЗ рдкрдирд┐, рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдб рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░ рд╣реБрдиреБрдкрд░реНрдЫред

рдпрд╕рдХреЛ рдХрд╛рд░рдг рдпреЛ рд╣реЛ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдШрдЯрдирд╛ рд▓реБрдк рдХрд╛рд░реНрдпрдХреНрд░рдордмрд╛рдЯ рд▓реБрдХреЗрдХреЛ рдЫ (рдпреЛ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛ 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 рдЕрд╕рд╛рдЗрдирдореЗрдиреНрдЯ

рд╣рд╛рдореНрд░реЛ "рдиреЗрдЯрд╡рд░реНрдХ" рдорд╛ рдиреЛрдб рдЖрдИрдбреАрд╣рд░реВ рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рд╣реЛрдЗрдирдиреН, рддрд░ рдлрд╛рдпрд░рдмреЗрд╕ рдХреБрдЮреНрдЬреАрд╣рд░реВ (рддрд┐рдиреАрд╣рд░реВ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫрдиреН: -LmEC50PYZLCiCP-vqde ).

рдпреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ рдХрд┐рдирднрдиреЗ рд╣рд╛рдореАрд▓рд╛рдИ IP рд╣рд░реВ рддреЛрдХреНрди рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдиреИ рд╕рдВрдпрдиреНрддреНрд░рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди (рд╕рд╛рдереИ рдЧреНрд░рд╛рд╣рдХрд▓реЗ рдЬрдбрд╛рди рд╡рд┐рдЪреНрдЫреЗрдж рдЧрд░реЗрдкрдЫрд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдбрд┐рд╕реНрдкреЛрдЬ рдЧрд░реНрдиреЗ), рддрд░ рдпреЛ рдкреНрд░рд╛рдпрдГ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рдирджреНрд╡рд╛рд░рд╛ рд╕рд╛рдереАрд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреНрдЫред

рдпреЛ рдареНрдпрд╛рдХреНрдХреИ рдХреЗ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред resolve ╨╕ reverseResolve: рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдХреБрдЮреНрдЬреАрдХреЛ рд╕реНрдЯреНрд░рд┐рдЩ рдорд╛рди (рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдЗрдирдкреБрдЯ рд╡рд╛ рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрднрд░ рдорд╛рд░реНрдлрдд) рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫ, рд░ рдпрд╕рд▓рд╛рдИ рдЖрдиреНрддрд░рд┐рдХ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ IP рдареЗрдЧрд╛рдирд╛рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдХреНрдЫред рдмрд╛рдБрдХреА API рд▓реЗ рдкрдирд┐ рд╕рд░рд▓рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрдЯреНрд░рд┐рдЩрдХреЛ рд╕рдЯреНрдЯрд╛ рдпреЛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫред

рдпреЛ DNS рд▓реБрдХрдЕрдк рдЬрд╕реНрддреИ рдЫ, рддрд░ рдЧреНрд░рд╛рд╣рдХ рдорд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рдкреНрд░рджрд░реНрд╢рдиред

рддреНрдпреЛ рд╣реЛ, рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рд╡рд┐рднрд┐рдиреНрди рдЧреНрд░рд╛рд╣рдХрд╣рд░реВ рдмреАрдЪ рд╕рд╛рдЭреЗрджрд╛рд░реА рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди, рд░ рдпрджрд┐ рдХреБрдиреИ рдкреНрд░рдХрд╛рд░рдХреЛ рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рдпреЛ рдлрд░рдХ рддрд░рд┐рдХрд╛рд▓реЗ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫред

рдЕрд▓реНрдЫреА рдЬрдбрд╛рди

UDP рд▓рд╛рдИ рдЬрдбрд╛рдирдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди, рддрд░ рд╣рд╛рдореАрд▓реЗ рджреЗрдЦреЗрдХрд╛ рдЫреМрдВ, WebRTC рд▓рд╛рдИ рджреБрдИ рд╕рд╛рдереАрд╣рд░реВ рдмреАрдЪ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐ рд▓рд╛рдореЛ рдЬрдбрд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд╣рд┐рдиреНрдЫред

рдпрджрд┐ рд╣рд╛рдореА рд╕рдорд╛рди рд╕реНрддрд░рдХреЛ рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ рднрдиреЗ, (sendto/recvfrom рдкреВрд░реНрд╡ рдЬрдбрд╛рди рдмрд┐рдирд╛ рдордирдорд╛рдиреА рд╕рд╛рдереАрд╣рд░реВрд╕рдБрдЧ), рддреНрдпрд╕рдкрдЫрд┐ рддрд┐рдиреАрд╣рд░реВрд▓реЗ API рднрд┐рддреНрд░ "рдЖрд▓рд╕реА" (рдврд┐рд▓рд╛рдЗ) рдЬрдбрд╛рди рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреБрдкрд░реНрдЫред

UDP рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛ "рд╕рд░реНрднрд░" рд░ "рдЧреНрд░рд╛рд╣рдХ" рдмреАрдЪрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдЮреНрдЪрд╛рд░рдХреЛ рд╕рдордпрдорд╛ рдХреЗ рд╣реБрдиреНрдЫ, рд░ рд╣рд╛рдореНрд░реЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд▓реЗ рдХреЗ рдЧрд░реНрдиреБрдкрд░реНрдЫ:

  • рд╕рд░реНрднрд░ рдХрд▓рд╣рд░реВ bind()рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдорд▓рд╛рдИ рдмрддрд╛рдЙрди рдХрд┐ рдпреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯрдорд╛ рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫред

рдпрд╕рдХреЛ рд╕рдЯреНрдЯрд╛, рд╣рд╛рдореА рд╕рд░реНрднрд░ рдХреБрдЮреНрдЬреА рдЕрдиреНрддрд░реНрдЧрдд рдлрд╛рдпрд░рдмреЗрд╕рдорд╛ рдЦреБрд▓рд╛ рдкреЛрд░реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВ рд░ рдпрд╕рдХреЛ рд╕рдмрдЯреНрд░реАрдорд╛ рдШрдЯрдирд╛рд╣рд░реВ рд╕реБрдиреНрдиреЗрдЫреМрдВред

  • рд╕рд░реНрднрд░ рдХрд▓рд╣рд░реВ recvfrom(), рдпрд╕ рдкреЛрд░реНрдЯрдорд╛ рдХреБрдиреИ рдкрдирд┐ рд╣реЛрд╕реНрдЯрдмрд╛рдЯ рдЖрдЙрдиреЗ рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрджреИред

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

рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд░реНрдЯрдХреЛ рдЖрдлреНрдиреИ рд▓рд╛рдо рд╣реБрдиреНрдЫ, рд░ рд╣рд╛рдореАрд▓реЗ рд╕реНрд░реЛрдд рд░ рдЧрдиреНрддрд╡реНрдп рдкреЛрд░реНрдЯрд╣рд░реВ WebRTC рдбрд╛рдЯрд╛рдЧреНрд░рд╛рдордХреЛ рд╕реБрд░реБрдорд╛ рдердкреНрдЫреМрдВ рддрд╛рдХрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рд╣реБрдиреНрдЫ рдХрд┐ рдирдпрд╛рдБ рдкреНрдпрд╛рдХреЗрдЯ рдЖрдЗрдкреБрдЧреНрджрд╛ рдХреБрди рд▓рд╛рдЗрди рдлрд░реНрд╡рд╛рд░реНрдб рдЧрд░реНрдиреЗ рд╣реЛред

рдХрд▓ рдЧреИрд░-рдмреНрд▓рдХ рдЫ, рддреНрдпрд╕реИрд▓реЗ рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВ рдЫреИрдирдиреН рднрдиреЗ, рд╣рд╛рдореА рдХреЗрд╡рд▓ -1 рдлрд░реНрдХрд╛рдЙрдБрдЫреМрдВ рд░ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ errno=EWOULDBLOCK.

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

рд╣рд╛рдореНрд░реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдЧреНрд░рд╛рд╣рдХрд▓реЗ рдмрд╛рд╣реНрдп рд░реВрдкрдорд╛ рд╕реНрдЯреНрд░рд┐рдЩ рдХреБрдЮреНрдЬреА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫ рд░ рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ resolve() IP рдареЗрдЧрд╛рдирд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиред

рдпрд╕ рдмрд┐рдиреНрджреБрдорд╛, рдпрджрд┐ рджреБрдИ рд╕рд╛рдереАрд╣рд░реВ рдЕрдЭреИ рдПрдХрдЕрд░реНрдХрд╛рд╕рдБрдЧ рдЬреЛрдбрд┐рдПрдХрд╛ рдЫреИрдирдиреН рднрдиреЗ рд╣рд╛рдореА WebRTC рд╣реНрдпрд╛рдиреНрдбрд╢реЗрдХ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВред рдПрдЙрдЯреИ рдкрд┐рдпрд░рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреЛрд░реНрдЯрд╣рд░реВрдорд╛ рдЬрдбрд╛рдирд╣рд░реВрд▓реЗ рдЙрд╣реА WebRTC DataChannel рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред

рд╣рд╛рдореА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкрдирд┐ рдЧрд░реНрдЫреМрдВ bind()рддрд╛рдХрд┐ рд╕рд░реНрднрд░ рдЕрд░реНрдХреЛрдорд╛ рдкреБрди: рдЬрдбрд╛рди рд╣реБрди рд╕рдХреНрдЫ sendto() рдпрджрд┐ рдпреЛ рдХреБрдиреИ рдХрд╛рд░рдгрд▓реЗ рдмрдиреНрдж рднрдпреЛ рднрдиреЗред

рд╕рд░реНрднрд░рд▓рд╛рдИ рдХреНрд▓рд╛рдЗрдиреНрдЯрдХреЛ рдЬрдбрд╛рдирдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕реВрдЪрд┐рдд рдЧрд░рд┐рдиреНрдЫ рдЬрдм рдХреНрд▓рд╛рдЗрдиреНрдЯрд▓реЗ рдлрд╛рдпрд░рдмреЗрд╕рдорд╛ рд╕рд░реНрднрд░ рдкреЛрд░реНрдЯ рдЬрд╛рдирдХрд╛рд░реА рдЕрдиреНрддрд░реНрдЧрдд рдЖрдлреНрдиреЛ SDP рдкреНрд░рд╕реНрддрд╛рд╡ рд▓реЗрдЦреНрдЫ, рд░ рд╕рд░реНрднрд░рд▓реЗ рддреНрдпрд╣рд╛рдБ рдпрд╕рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдХреЛ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдиреНрдЫред

рддрд▓рдХреЛ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░рд▓реЗ рд╕рдХреЗрдЯ рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╡рд╛рд╣рдХреЛ рдЙрджрд╛рд╣рд░рдг рд░ рдЧреНрд░рд╛рд╣рдХрдмрд╛рдЯ рд╕рд░реНрднрд░рдорд╛ рдкрд╣рд┐рд▓реЛ рд╕рдиреНрджреЗрд╢рдХреЛ рдкреНрд░рд╕рд╛рд░рдг рджреЗрдЦрд╛рдЙрдБрдЫ:

Cheerp, WebRTC рд░ Firebase рд╕рдБрдЧ C++ рдмрд╛рдЯ рд╡реЗрдмрдорд╛ рдорд▓реНрдЯрд┐рдкреНрд▓реЗрдпрд░ рдЦреЗрд▓ рдкреЛрд░реНрдЯ рдЧрд░реНрджреИ
рдЧреНрд░рд╛рд╣рдХ рд░ рд╕рд░реНрднрд░ рдмреАрдЪ рдЬрдбрд╛рди рдЪрд░рдг рдХреЛ рдкреВрд░рд╛ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░

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

рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЕрд╣рд┐рд▓реЗ рд╕рдореНрдо рдкрдвреНрдиреБрднрдПрдХреЛ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВ рд╕рд╛рдпрдж рдХрд╛рд░реНрдпрдорд╛ рд╕рд┐рджреНрдзрд╛рдиреНрдд рд╣реЗрд░реНрди рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреБрд╣реБрдиреНрдЫред рдорд╛ рдЦреЗрд▓ рдЦреЗрд▓реНрди рд╕рдХрд┐рдиреНрдЫ teeworlds.leaningtech.com, рдХрд╛реЗрд╢рд┐рд╕ рдЧрд░!


рд╕рд╣рдХрд░реНрдореАрд╣рд░реВ рдмреАрдЪ рдореИрддреНрд░реАрдкреВрд░реНрдг рдЦреЗрд▓

рд╕рдЮреНрдЬрд╛рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рдпрд╣рд╛рдБ рд╕реНрд╡рддрдиреНрддреНрд░ рд░реВрдкрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫ Githubред рд╣рд╛рдореНрд░реЛ рдЪреНрдпрд╛рдирд▓рдорд╛ рднрдПрдХреЛ рдХреБрд░рд╛рдХрд╛рдиреАрдорд╛ рд╕рд╛рдореЗрд▓ рд╣реБрдиреБрд╣реЛрд╕реН рдЧрдЯрд░!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди