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

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

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

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

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