ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΡΠ°Π»Π½ΠΈΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΈ Π½Π°ΡΡΠΎΠ»Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅Π±. ΠΠ°ΡΠΈΡΡ C++ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ WebAssembly ΠΈ JavaScript, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΠΈ , ΠΈ Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ.
ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ ΠΌΡ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΠΏΠΎΡΡΠΈΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΊΠ° ΠΈΠ³ΡΠ° Π·Π° ΡΠ΅Π± ΠΈ ΠΈΠ·Π±ΡΠ°Ρ ΠΌΠ΅ Π·Π° ΡΠΎΠ²Π° . Teeworlds Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΊΠ° Π΄Π²ΡΠΌΠ΅ΡΠ½Π° ΡΠ΅ΡΡΠΎ ΠΈΠ³ΡΠ° Ρ ΠΌΠ°Π»ΠΊΠΎ, Π½ΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ ΠΎΡ ΠΈΠ³ΡΠ°ΡΠΈ (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ ΠΌΠ΅Π½!). Π’Ρ Π΅ ΠΌΠ°Π»ΠΊΠ° ΠΊΠ°ΠΊΡΠΎ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈ, ΡΠ°ΠΊΠ° ΠΈ ΠΏΠΎ ΠΈΡΠΊΠ°Π½ΠΈΡ ΠΊΡΠΌ Π¦Π ΠΈ GPU β ΠΈΠ΄Π΅Π°Π»Π½ΠΈΡΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ.

Π Π°Π±ΠΎΡΠΈ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Teeworlds
Π Π΅ΡΠΈΡ
ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ, Π·Π° Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ Ρ ΠΎΠ±ΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° ΠΏΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ ΡΠ΅Π±. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π°ΡΠΈΠ½ΠΈ:
- XMLHttpRequest/fetch, Π°ΠΊΠΎ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΡΠ°ΡΡ Π΅ ΡΠ°ΠΌΠΎ ΠΎΡ HTTP Π·Π°ΡΠ²ΠΊΠΈ, ΠΈΠ»ΠΈ
- WebSockets.
Π Π΄Π²Π°ΡΠ° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ Ρ ΠΎΡΡΠΈΠ½Π³ Π½Π° ΡΡΡΠ²ΡΡΠ½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° ΠΈ Π½ΠΈΡΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° . Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΊΠ°ΡΠΎ ΡΠΎΡΡΡΠ΅Ρ Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈ ΠΈ ΠΈΠ³ΡΠΈ, Π·Π°ΡΠΎΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΠΈΡΠ΅ Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° ΠΈ ΡΠ΅Π΄ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΌΠΎΠ³Π°Ρ Π΄Π° Π½Π°ΡΡΡΠ°Ρ Π½ΠΈΡΠΊΠΈΡΠ΅ Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΡ.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΈ ΡΡΠ΅ΡΠΈ ΠΏΡΡ β ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΎΡ Π±ΡΠ°ΡΠ·ΡΡΠ°: .
ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΊΠ°ΠΊ Π½Π°Π΄Π΅ΠΆΠ΄Π½Π°, ΡΠ°ΠΊΠ° ΠΈ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ΄Π½Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ (Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° UDP ΠΊΠ°ΡΠΎ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅Π½ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»), ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΠΊΠ°ΠΊΡΠΎ Ρ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΡΡΡΠ²ΡΡ, ΡΠ°ΠΊΠ° ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π±ΡΠ°ΡΠ·ΡΡΠΈ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΡΡΠΈΠΌ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π²ΡΠΈΡΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ ΡΡΡΠ²ΡΡΠ½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ!
ΠΠΎ Ρ ΡΠΎΠ²Π° ΠΈΠ΄Π²Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΡΡΡΠ΄Π½ΠΎΡΡ: ΠΏΡΠ΅Π΄ΠΈ Π΄Π²Π°ΡΠ° ΠΏΠΈΡΠ° WebRTC Π΄Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π΄Π°Π½Π½ΠΈ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Ρ ΠΏΡΠ΅Π· ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ»ΠΎΠΆΠ½Π° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π½Π° "ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΠ΅" Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠ°Π½ΠΈΡΠ½ΠΈ ΡΡΠ±Π΅ΠΊΡΠ° (ΡΠΈΠ³Π½Π°Π»Π΅Π½ ΡΡΡΠ²ΡΡ ΠΈ Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ /).
Π ΠΈΠ΄Π΅Π°Π»Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π±ΠΈΡ ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΌΡΠ΅ΠΆΠΎΠ² API, ΠΊΠΎΠΉΡΠΎ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° WebRTC, Π½ΠΎ ΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ-Π±Π»ΠΈΠ·ΡΠΊ Π΄ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π° UDP Sockets, Π½Π° ΠΊΠΎΠΉΡΠΎ Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° Π²ΡΡΠ·ΠΊΠ°.
Π’ΠΎΠ²Π° ΡΠ΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° Π½Π° WebRTC Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΡΠ°Π·ΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ (ΠΊΠΎΠΉΡΠΎ Π² Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΡΠΊΠ°Ρ ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΎ).
ΠΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ WebRTC
WebRTC Π΅ Π½Π°Π±ΠΎΡ ΠΎΡ API Π² Π±ΡΠ°ΡΠ·Π΅ΡΠΈΡΠ΅, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° peer-to-peer ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π²ΡΠΊ, Π²ΠΈΠ΄Π΅ΠΎ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π΄Π°Π½Π½ΠΈ.
Π‘Π²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΈΡΠΈΡΠ΅ ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° (Π΄ΠΎΡΠΈ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π° NAT ΠΎΡ Π΅Π΄Π½Π°ΡΠ° ΠΈΠ»ΠΈ ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΡΡΠ°Π½ΠΈ) Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠΈ STUN ΠΈ/ΠΈΠ»ΠΈ TURN ΡΡΠ΅Π· ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ, Π½Π°ΡΠ΅ΡΠ΅Π½ ICE. ΠΠΈΡΠΈΡΠ΅ ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ICE ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΡΠ΅Π· offer ΠΈ answer ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° SDP.
Π£Π°Ρ! ΠΠΎΠ»ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π½Π°Π²Π΅Π΄Π½ΡΠΆ. ΠΠ΅ΠΊΠ° Π½Π°ΠΊΡΠ°ΡΠΊΠΎ ΠΎΠ±ΡΡΠ½ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°Ρ ΡΠ΅Π·ΠΈ ΠΏΠΎΠ½ΡΡΠΈΡ:
- Π΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π·Π° Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ Π½Π° NAT ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π΄Π²ΠΎΠΉΠΊΠ° (IP, ΠΏΠΎΡΡ) Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ ΠΎΠ±ΠΌΠ΅Π½ Π½Π° Π΄Π°Π½Π½ΠΈ Ρ Ρ ΠΎΡΡΠ°. ΠΠΊΠΎ ΡΡΠΏΠ΅Π΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈ Π·Π°Π΄Π°ΡΠ°ΡΠ° ΡΠΈ, ΠΏΠΈΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π΄Π°Π½Π½ΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.
- ΡΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ Π½Π° NAT, Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΡΠΎΠ²Π°, ΠΏΡΠ΅ΠΏΡΠ°ΡΠ°ΠΉΠΊΠΈ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΡΠ΅Π· ΠΏΡΠΎΠΊΡΠΈ, Π²ΠΈΠ΄ΠΈΠΌ ΠΈ Π·Π° Π΄Π²Π°ΡΠ° ΠΏΠΈΡΠ°. Π’ΠΎΠΉ Π΄ΠΎΠ±Π°Π²Ρ Π·Π°Π±Π°Π²ΡΠ½Π΅ ΠΈ Π΅ ΠΏΠΎ-ΡΠΊΡΠΏ ΠΏΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡ STUN (ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΏΡΠ΅Π· ΡΠ΅Π»ΠΈΡ ΡΠ΅Π°Π½Ρ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ°), Π½ΠΎ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ.
- ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΈΠ·Π±ΠΎΡ Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π΄Π²Π°ΡΠ° ΠΏΠΈΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΠΏΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½Π° ΡΠ²ΡΡΠ·Π°Π½ΠΎΡΡ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΠΎΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΡΠ²ΡΡΠΈ STUN ΠΈ TURN.
- Π΅ ΡΠΎΡΠΌΠ°Ρ Π·Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΈ ICE, ΠΌΡΠ»ΡΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΈ ΠΊΠΎΠ΄Π΅ΡΠΈ (Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π°ΡΠ΄ΠΈΠΎ/Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Π½Π°Π») ΠΈ Ρ.Π½. ΠΠ΄ΠΈΠ½ ΠΎΡ ΠΏΠΈΡΠΈΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° SDP Offer (βΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅β), Π° Π²ΡΠΎΡΠΈΡΡ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Ρ SDP Answer (βΠΎΡΠ³ΠΎΠ²ΠΎΡβ). Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΊΠ°Π½Π°Π».
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π°Ρ ΡΠ°ΠΊΠ°Π²Π° Π²ΡΡΠ·ΠΊΠ°, ΠΏΠΈΡΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ±Π΅ΡΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΠΎΡ ΡΡΡΠ²ΡΡΠΈΡΠ΅ STUN ΠΈ TURN, ΠΈ Π΄Π° Ρ ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.
ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π΅, ΡΠ΅ ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π΄Π°Π½Π½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ Π·Π° ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΈΠ·Π²ΡΠ½ΠΏΠΎΠ»ΠΎΡΠ΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ: ΡΠΈΠ³Π½Π°Π»Π΅Π½ ΡΡΡΠ²ΡΡ.
Π‘ΠΈΠ³Π½Π°Π»Π½ΠΈΡΡ ΡΡΡΠ²ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° ΠΌΡ Π·Π°Π΄Π°ΡΠ° Π΅ Π΄Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΈΡΠΈΡΠ΅ Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° βΡΡΠΊΠΎΡΡΠΈΡΠΊΠ°Π½Π΅β (ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΡ Π΅ΠΌΠ°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ).

ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π° ΡΡ
Π΅ΠΌΠ° Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° βΡΡΠΊΠΎΡΡΠΈΡΠΊΠ°Π½Π΅β WebRTC
ΠΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° Teeworlds
ΠΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° Teeworlds Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠ°:
- ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΡΡΠ²ΡΡΠ° ΡΠ° Π΄Π²Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ.
- ΠΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ Π²Π»ΠΈΠ·Π°Ρ Π² ΠΈΠ³ΡΠ°ΡΠ°, ΡΠ²ΡΡΠ·Π²Π°ΠΉΠΊΠΈ ΡΠ΅ Ρ Π΅Π΄ΠΈΠ½ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠ²ΡΡΠ°, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ Ρ ΠΎΡΡΠ²Π° ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΠΈΠ³ΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅.
- Π¦ΡΠ»Π°ΡΠ° ΠΎΠ±ΠΌΠ΅Π½Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² ΠΈΠ³ΡΠ°ΡΠ° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· ΡΡΡΠ²ΡΡΠ°.
- Π‘ΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΌΠ°ΠΉΡΡΠΎΡ-ΡΡΡΠ²ΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΈ ΡΡΡΠ²ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ Π² ΠΈΠ³ΡΠΎΠ²ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° WebRTC Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΡΡΡΠ²ΡΡΠ½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΠΈΠ³ΡΠ°ΡΠ° Π² Π±ΡΠ°ΡΠ·ΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ. Π’ΠΎΠ²Π° Π½ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΡΠ΄Π΅ΡΠ½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡβ¦
ΠΠ° ΡΠ΅ ΠΎΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΡ ΡΡΡΠ²ΡΡΠΈΡΠ΅
ΠΠΈΠΏΡΠ°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ½Π° Π»ΠΎΠ³ΠΈΠΊΠ° ΠΈΠΌΠ° ΠΏΡΠΈΡΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ: ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΡΡΠ»ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ ΡΡΠ°ΡΠΈΡΠ½ΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π½Π° Github Pages ΠΈΠ»ΠΈ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎ ΠΎΠ±ΠΎΡΡΠ΄Π²Π°Π½Π΅ Π·Π°Π΄ Cloudflare, ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΠΉΠΊΠΈ ΡΠΈ ΡΠ°ΠΊΠ° Π±ΡΡΠ·ΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½ΠΈΡ ΠΈ Π²ΠΈΡΠΎΠΊ uptime Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ. ΠΡΡΡΠ½ΠΎΡΡ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°Π±ΡΠ°Π²ΠΈΠΌ Π·Π° ΡΡΡ , ΠΈ Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΡΡΠΌΠ΅Ρ ΠΈ ΠΈΠ³ΡΠ°ΡΠ° ΡΡΠ°Π½Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°, Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²ΡΠ½ΡΠ½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°:
- ΠΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ STUN ΡΡΡΠ²ΡΡΠ°: ΠΈΠΌΠ°ΠΌΠ΅ ΠΈΠ·Π±ΠΎΡ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ°.
- ΠΠΎΠ½Π΅ Π΅Π΄ΠΈΠ½ TURN ΡΡΡΠ²ΡΡ: ΡΡΠΊ Π½ΡΠΌΠ° Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΈ ΠΎΠΏΡΠΈΠΈ, Π·Π°ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ»ΠΈ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ Π½Π°Ρ, ΠΈΠ»ΠΈ Π΄Π° ΠΏΠ»Π°ΡΠΈΠΌ Π·Π° ΡΡΠ»ΡΠ³Π°. ΠΠ° ΡΠ°ΡΡΠΈΠ΅, ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠ°ΡΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π΅Π½Π° ΡΡΠ΅Π· STUN ΡΡΡΠ²ΡΡΠΈ (ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΠΉΠΊΠΈ ΠΈΡΡΠΈΠ½ΡΠΊΠΎ p2p), Π½ΠΎ TURN Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΊΠ°ΡΠΎ ΡΠ΅Π·Π΅ΡΠ²Π΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ.
- Π‘ΠΈΠ³Π½Π°Π»Π΅Π½ ΡΡΡΠ²ΡΡ: Π·Π° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Π΄ΡΡΠ³ΠΈΡΠ΅ Π΄Π²Π° Π°ΡΠΏΠ΅ΠΊΡΠ°, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π΅ Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ. Π’ΠΎΠ²Π°, Π·Π° ΠΊΠΎΠ΅ΡΠΎ Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ ΡΠΈΠ³Π½Π°Π»Π½ΠΈΡΡ ΡΡΡΠ²ΡΡ, Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈ Π²ΡΡΠ·ΠΊΠ°, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΠΈΠΌ ΠΌΠ°Π»ΡΠΊ ΠΎΠ±Π΅ΠΌ Π΄Π°Π½Π½ΠΈ.
- ΠΠ°ΠΉΡΡΠΎΡ-ΡΡΡΠ²ΡΡ Teeworlds: ΡΠΎΠΉ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΡΡΠ²ΡΡΠΈ, Π·Π° Π΄Π° ΡΠ²Π΅Π΄ΠΎΠΌΡΡ Π·Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ ΡΠΈ ΠΈ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ Π΄Π° ΡΡΡΡΡΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΈ ΡΡΡΠ²ΡΡΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π½Π΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ (ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ°Ρ ΡΡΡΠ½ΠΎ Ρ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΈΠΌ ΡΡΡΠ²ΡΡ), Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±ΡΠ΅ Π΄Π° Π³ΠΎ ΠΈΠΌΠ°ΠΌΠ΅, Π·Π° Π΄Π° ΠΌΠΎΠ³Π°Ρ ΠΈΠ³ΡΠ°ΡΠΈΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠ²Π°Ρ Π² ΠΈΠ³ΡΠΈ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Ρ ΠΎΡΠ°.
Π Π΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΈ STUN ΡΡΡΠ²ΡΡΠΈ Π½Π° Google, Π° Π΅Π΄ΠΈΠ½ TURN ΡΡΡΠ²ΡΡ Π½Π°ΡΡΡΠΎΠΈΡ ΠΌΠ΅ ΡΠ°ΠΌΠΈ.
ΠΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π΅ ΡΠΎΡΠΊΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ :
- ΠΠ°ΠΉΡΡΠΎΡ-ΡΡΡΠ²ΡΡΡΡ Teeworlds Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎ: ΠΊΠ°ΡΠΎ ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΠΎΠ±Π΅ΠΊΡΠΈ, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (ΠΈΠΌΠ΅, IP, ΠΊΠ°ΡΡΠ°, ΡΠ΅ΠΆΠΈΠΌ ΠΈ Π΄Ρ.) Π·Π° Π²ΡΠ΅ΠΊΠΈ Π°ΠΊΡΠΈΠ²Π΅Π½ ΡΡΡΠ²ΡΡ. Π‘ΡΡΠ²ΡΡΠΈΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Ρ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡΠ΅ ΡΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ ΡΠ΅Π»ΠΈΡ ΡΠΏΠΈΡΡΠΊ ΠΈ Π³ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ Π½Π° ΠΈΠ³ΡΠ°ΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΡΠΏΠΈΡΡΠΊΠ° Π½Π° Π½Π°ΡΠ°Π»Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΠΊΠ°ΡΠΎ HTML, Π·Π° Π΄Π° ΠΌΠΎΠ³Π°Ρ ΠΈΠ³ΡΠ°ΡΠΈΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π°Ρ Π²ΡΡΡ Ρ ΡΡΡΠ²ΡΡΠ° ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π΄Π° Π²Π»ΡΠ·Π°Ρ Π² ΠΈΠ³ΡΠ°ΡΠ°.
- Π‘ΠΈΠ³Π½Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π΅ ΡΡΡΠ½ΠΎ ΡΠ²ΡΡΠ·Π°Π½Π° Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅, ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π».

Π‘ΠΏΠΈΡΡΠΊ Π½Π° ΡΡΡΠ²ΡΡΠΈΡΠ΅ Π² ΠΈΠ³ΡΠ°ΡΠ° ΠΈ Π½Π° Π½Π°ΡΠ°Π»Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ°
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅
ΠΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ 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-ΡΠΎ Π΅ ΠΏΡΠΎΡΡΠΎ ΠΈ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΡΠ²Π° API-ΡΠΎ Π½Π° Posix Sockets, Π½ΠΎ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²Π°ΠΆΠ½ΠΈ ΡΠ°Π·Π»ΠΈΠΊΠΈ: ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅, Π½Π°Π·Π½Π°ΡΠ°Π²Π°Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈ IP Π°Π΄ΡΠ΅ΡΠΈ ΠΈ βΠ»Π΅Π½ΠΈΠ²ΠΎβ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅.
Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅
ΠΠΎΡΠΈ Π°ΠΊΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π΅Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠΎ Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅-ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π² ΡΠ΅Π± Π±ΡΠ°ΡΠ·ΡΡ, ΠΊΠΎΠ΄ΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ·ΠΈΡΠ°Π½.
ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΡΠΎΠ²Π° Π΅, ΡΠ΅ ΡΠΈΠΊΡΠ»ΡΡ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π΅ ΡΠΊΡΠΈΡ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π΄Π°Π»ΠΈ Π΅ JavaScript ΠΈΠ»ΠΈ WebAssembly).
Π Π½Π°ΡΠΈΠ²Π½Π° ΡΡΠ΅Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ΄ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½
while(running) {
select(...); // ΡΠ°ΠΊΠ° Π·Π° I/O ΡΡΠ±ΠΈΡΠΈΡ
while(true) {
int r = readfrom(...); // ΠΎΠΏΠΈΡΠ²Π° ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅
if (r < 0 && errno == EWOULDBLOCK) // Π½ΡΠΌΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ
break;
...
}
...
}ΠΠΊΠΎ ΡΠΈΠΊΡΠ»ΡΡ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Π΅ ΡΠΊΡΠΈΡ Π·Π° Π½Π°Ρ, ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΠΌΠ΅ Π² Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:
auto cb = []() { // ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ
while(true) {
int r = readfrom(...); // ΠΎΠΏΠΈΡΠ²Π° ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅
if (r < 0 && errno == EWOULDBLOCK) // Π½ΡΠΌΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ
break;
...
}
...
};
recvCallback(cb); // ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΠΠ°Π·Π½Π°ΡΠ°Π²Π°Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈ 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()ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π±Π΅Π· ΡΠ²Π½ΠΎΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° bind.recvfrom()ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π±Π΅Π· ΡΠ²Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° bind.
Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΡΡΠΈΠ½Π³ΠΎΠ² ΠΊΠ»ΡΡ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° resolve() Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° IP Π°Π΄ΡΠ΅Ρ.
Π ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ "ΡΡΠΊΠΎΡΡΠΈΡΠΊΠ°Π½Π΅ΡΠΎ" Π½Π° WebRTC, Π°ΠΊΠΎ Π΄Π²Π°ΡΠ° ΠΏΠΈΡΠ° Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. Π‘Π²ΡΡΠ·Π²Π°Π½ΠΈΡΡΠ° ΠΊΡΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΡΡΠΎΠ²Π΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΠΏΠΈΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ DataChannel WebRTC.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ ΠΈΠ½Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ bind(), Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ ΡΡΡΠ²ΡΡΡΡ Π΄Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ sendto() Π΅ΡΠ»ΠΈ ΡΡ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π° Π΅ Π·Π°ΡΠ²ΠΎΡΠ΅Π½Π°.
Π‘ΡΡΠ²ΡΡΡΡ ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΡΠ²Π° Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ Π·Π°ΠΏΠΈΡΠ΅ ΡΠ²ΠΎΡ SDP ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΡΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° Π² Firebase ΠΈ ΡΡΡΠ²ΡΡΡΡ ΡΠ°ΠΌ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΠ²ΠΎΠ΅ΡΠΎ Π²ΡΠ·ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
ΠΠ° ΠΏΠΎΠΊΠ°Π·Π°Π½Π°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΡ Π΅ΠΌΠ° Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° ΡΡ Π΅ΠΌΠ°ΡΠ° Π½Π° ΡΠΎΠΊΠ΅ΡΠΈ ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ΡΠΎ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½Π° ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΡΡΡΠ²ΡΡΠ°:

ΠΡΠ»Π½Π° ΡΡ
Π΅ΠΌΠ° Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΡΡΠ²ΡΡΠ°
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΊΠΎ ΡΡΠ΅ ΠΏΡΠΎΡΠ΅Π»ΠΈ Π΄ΠΎ ΠΊΡΠ°Ρ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π²ΠΈ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅ΠΎΡΠΈΡΡΠ° Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ³ΡΠ°Π΅ΡΠ΅ Π½Π° , ΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅!
ΠΡΠΈΡΡΠ΅Π»ΡΠΊΠ° ΠΈΠ³ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ»Π΅Π³ΠΈ
ΠΠΎΠ΄ΡΡ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° . ΠΡΠΈΡΡΠ΅Π΄ΠΈΠ½Π΅ΡΠ΅ ΡΠ΅ ΠΊΡΠΌ ΠΎΠ±ΡΡΠ²Π°Π½Π΅ΡΠΎ Π² Π½Π°ΡΠΈΡ ΠΊΠ°Π½Π°Π» Π² !
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
