Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π½Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ
ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΌΡ ΡΠ΅ΡΠΈΡ
ΠΌΠ΅ Π΄Π° ΠΏΡΠ΅Π½Π΅ΡΠ΅ΠΌ ΠΌΡΠ»ΡΠΈΠΏΠ»Π΅ΠΉΡΡ ΠΈΠ³ΡΠ° Π·Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈ ΠΈΠ·Π±ΡΠ°Ρ
ΠΌΠ΅
Π Π°Π±ΠΎΡΠΈ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Teeworlds
Π Π΅ΡΠΈΡ
ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ, Π·Π° Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ ΠΎΠ±ΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° ΠΏΡΠ΅Π½Π°ΡΡΠ½Π΅ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ² ΠΊΠΎΠ΄ ΠΊΡΠΌ ΠΌΡΠ΅ΠΆΠ°ΡΠ°. Π’ΠΎΠ²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π°ΡΠΈΠ½ΠΈ:
- XMLHttpRequest/fetch, Π°ΠΊΠΎ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΡΠ°ΡΡ ΡΠ΅ ΡΡΡΡΠΎΠΈ ΡΠ°ΠΌΠΎ ΠΎΡ HTTP Π·Π°ΡΠ²ΠΊΠΈ, ΠΈΠ»ΠΈ
- WebSockets.
Π Π΄Π²Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ Ρ
ΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡ ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° ΠΈ Π½ΠΈΡΠΎ Π΅Π΄Π½ΠΎ ΠΎΡ ΡΡΡ
Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΡΠΎ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅Π½ ΠΏΡΠΎΡΠΎΠΊΠΎΠ».
ΠΠΌΠ° ΠΈ ΡΡΠ΅ΡΠΈ Π½Π°ΡΠΈΠ½ - Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΎΡ Π±ΡΠ°ΡΠ·ΡΡΠ°:
Π’ΠΎΠ²Π° ΠΎΠ±Π°ΡΠ΅ ΠΈΠ΄Π²Π° Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΡΡΡΠ΄Π½ΠΎΡΡ: ΠΏΡΠ΅Π΄ΠΈ Π΄Π²Π° WebRTC ΠΏΠ°ΡΡΠ½ΡΠΎΡΠ° Π΄Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ°Ρ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²ΡΡΡΠ°Ρ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΡΠΊΠΎΡΡΠΈΡΠΊΠ°Π½Π΅, Π·Π° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ°Ρ, ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π° ΡΡΠ΅ΡΠΈ ΡΡΡΠ°Π½ΠΈ (ΡΡΡΠ²ΡΡ Π·Π° ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅
Π ΠΈΠ΄Π΅Π°Π»Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π±ΠΈΡ ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΌΡΠ΅ΠΆΠΎΠ² API, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²ΡΡΡΠ΅ΡΠ½ΠΎ WebRTC, Π½ΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π° UDP Sockets, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΡΠ·ΠΊΠ°.
Π’ΠΎΠ²Π° ΡΠ΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡ WebRTC, Π±Π΅Π· Π΄Π° ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΠΈΠ·Π»Π°Π³Π°ΠΌΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΈ Π΄Π΅ΡΠ°ΠΉΠ»ΠΈ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ (ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ°Ρ ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΎ Π² Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ).
ΠΠΈΠ½ΠΈΠΌΡΠΌ WebRTC
WebRTC Π΅ Π½Π°Π±ΠΎΡ ΠΎΡ API, Π½Π°Π»ΠΈΡΠ½ΠΈ Π² Π±ΡΠ°ΡΠ·ΡΡΠΈΡΠ΅ Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π°ΡΠ΄ΠΈΠΎ, Π²ΠΈΠ΄Π΅ΠΎ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΠΈΠΏ peer-to-peer.
ΠΡΡΠ·ΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈΡΠ΅ ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° (Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΠΈΠΌΠ° NAT ΠΎΡ Π΅Π΄Π½Π°ΡΠ° ΠΈΠ»ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΡΡΠ°Π½ΠΈ) Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° STUN ΠΈ/ΠΈΠ»ΠΈ TURN ΡΡΡΠ²ΡΡΠΈ ΡΡΠ΅Π· ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ, Π½Π°ΡΠ΅ΡΠ΅Π½ ICE. ΠΠ°ΡΡΠ½ΡΠΎΡΠΈΡΠ΅ ΠΎΠ±ΠΌΠ΅Π½ΡΡ ICE ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° ΠΊΠ°Π½Π°Π»Π° ΡΡΠ΅Π· ΠΎΡΠ΅ΡΡΠ°ΡΠ° ΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° Π½Π° SDP ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°.
ΠΡ Π°! ΠΠΎΠ»ΠΊΠΎ ΡΡΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π½Π°Π²Π΅Π΄Π½ΡΠΆ. ΠΠ΅ΠΊΠ° Π½Π°ΠΊΡΠ°ΡΠΊΠΎ ΠΎΠ±ΡΡΠ½ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°Ρ ΡΠ΅Π·ΠΈ ΡΠ΅ΡΠΌΠΈΠ½ΠΈ:
ΠΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΡΠΈΡ Π·Π° NAT (ΠΠΠ¨ΠΠΠΠ’Π―ΠΠΠΠ) - ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π·Π° Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ Π½Π° NAT ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π΄Π²ΠΎΠΉΠΊΠ° (IP, ΠΏΠΎΡΡ) Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ Ρ Ρ ΠΎΡΡΠ°. ΠΠΊΠΎ ΡΠΎΠΉ ΡΡΠΏΠ΅Π΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈ Π·Π°Π΄Π°ΡΠ°ΡΠ° ΡΠΈ, ΡΠΎΠ³Π°Π²Π° ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π΄Π°Π½Π½ΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.ΠΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π»Π΅ΡΠ° ΠΎΠΊΠΎΠ»ΠΎ NAT (ΠΠͺΠ ΠΠΠ’Π) ΡΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ Π½Π° NAT, Π½ΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π° ΡΡΠ΅Π· ΠΏΡΠ΅ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΏΡΠ΅Π· ΠΏΡΠΎΠΊΡΠΈ, Π²ΠΈΠ΄ΠΈΠΌΠΎ ΠΈ Π·Π° Π΄Π²Π°ΠΌΠ°ΡΠ° ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈ. Π’ΠΎΠΉ Π΄ΠΎΠ±Π°Π²Ρ Π»Π°ΡΠ΅Π½ΡΠ½ΠΎΡΡ ΠΈ Π΅ ΠΏΠΎ-ΡΠΊΡΠΏ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡ STUN (Π·Π°ΡΠΎΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΏΡΠ΅Π· ΡΡΠ»Π°ΡΠ° ΡΠ΅ΡΠΈΡ), Π½ΠΎ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° ΠΎΠΏΡΠΈΡ.Π£ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π° ΡΠ²ΡΡΠ·Π°Π½ΠΎΡΡ (ICE) ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΈΠ·Π±ΠΎΡ Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π΄Π²Π°ΠΌΠ° ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π±ΡΠΎΠΉ STUN ΠΈ TURN ΡΡΡΠ²ΡΡΠΈ.ΠΡΠΎΡΠΎΠΊΠΎΠ» Π·Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΠΈΡΡΠ° (SDP) - ΡΠΎΠ²Π° Π΅ ΡΠΎΡΠΌΠ°Ρ Π·Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΊΠ°Π½Π°Π»Π° Π·Π° Π²ΡΡΠ·ΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΈ Π·Π° ICE, ΠΌΡΠ»ΡΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΈ ΠΊΠΎΠ΄Π΅ΡΠΈ (Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π°ΡΠ΄ΠΈΠΎ / Π²ΠΈΠ΄Π΅ΠΎ ΠΊΠ°Π½Π°Π») ΠΈ Ρ.Π½. ΠΠ΄ΠΈΠ½ΠΈΡΡ ΠΎΡ ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° SDP ΠΎΡΠ΅ΡΡΠ° (βΠΎΡΠ΅ΡΡΠ°β), Π° Π²ΡΠΎΡΠΈΡΡ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Ρ SDP ΠΎΡΠ³ΠΎΠ²ΠΎΡ (βΠΎΡΠ³ΠΎΠ²ΠΎΡβ). Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΊΠ°Π½Π°Π».
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π°Ρ ΡΠ°ΠΊΠ°Π²Π° Π²ΡΡΠ·ΠΊΠ°, ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ±ΠΈΡΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ ΠΎΡ ΡΡΡΠ²ΡΡΠΈΡΠ΅ STUN ΠΈ TURN, ΠΈ Π΄Π° Ρ ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.
ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π΅, ΡΠ΅ ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π΄Π°Π½Π½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ ΠΈΠ·Π²ΡΠ½ Π»Π΅Π½ΡΠ°ΡΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ: ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΡΡΡΠ²ΡΡ.
Π‘ΡΡΠ²ΡΡΡΡ Π·Π° ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡ, Π·Π°ΡΠΎΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° ΠΌΡ Π·Π°Π΄Π°ΡΠ° Π΅ Π΄Π° ΠΏΡΠ΅ΠΏΡΠ°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° "ΡΡΠΊΠΎΡΡΠΈΡΠΊΠ°Π½Π΅" (ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ).
ΠΠΏΡΠΎΡΡΠ΅Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ Π½Π° ΡΡΠΊΠΎΡΡΠΈΡΠΊΠ°Π½Π΅ Π½Π° WebRTC
ΠΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΠΌΠΎΠ΄Π΅Π» Π½Π° Teeworlds
ΠΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° Teeworlds Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠ°:
- ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡΠ΅ ΠΈ ΡΡΡΠ²ΡΡΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΡΠ° Π΄Π²Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ.
- ΠΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ Π²Π»ΠΈΠ·Π°Ρ Π² ΠΈΠ³ΡΠ°ΡΠ°, ΠΊΠ°ΡΠΎ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°Ρ ΠΊΡΠΌ Π΅Π΄ΠΈΠ½ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠ²ΡΡΠ°, ΠΊΠ°ΡΠΎ Π²ΡΠ΅ΠΊΠΈ Ρ ΠΎΡΡΠ²Π° ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΠΈΠ³ΡΠ° Π½Π°Π²Π΅Π΄Π½ΡΠΆ.
- Π¦ΡΠ»ΠΎΡΠΎ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² ΠΈΠ³ΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠ΅Π· ΡΡΡΠ²ΡΡΠ°.
- Π‘ΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ Π³Π»Π°Π²Π΅Π½ ΡΡΡΠ²ΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΠΊ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΈ ΡΡΡΠ²ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ Π² ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½Π° ΠΈΠ³ΡΠ°ΡΠ°.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° WebRTC Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΠΈΠΌ ΡΡΡΠ²ΡΡΠ½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΠΈΠ³ΡΠ°ΡΠ° ΠΊΡΠΌ Π±ΡΠ°ΡΠ·ΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ. Π’ΠΎΠ²Π° Π½ΠΈ Π΄Π°Π²Π° ΡΡΠ΄Π΅ΡΠ½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ...
ΠΡΡΡΠ²Π΅ΡΠ΅ ΡΠ΅ ΠΎΡ ΡΡΡΠ²ΡΡΠΈΡΠ΅
ΠΠΈΠΏΡΠ°ΡΠ° Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° ΡΡΡΠ²ΡΡΠ° ΠΈΠΌΠ° Ρ ΡΠ±Π°Π²ΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ: ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΡΡΠ»ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ ΡΡΠ°ΡΠΈΡΠ½ΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π½Π° Github ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈΠ»ΠΈ Π½Π° Π½Π°ΡΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ Ρ Π°ΡΠ΄ΡΠ΅Ρ Π·Π°Π΄ Cloudflare, ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅ Π±ΡΡΠ·ΠΈ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½ΠΈΡ ΠΈ Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ. ΠΡΡΡΠ½ΠΎΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° Π·Π°Π±ΡΠ°Π²ΠΈΠΌ Π·Π° ΡΡΡ ΠΈ Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΡΡΠΌΠ΅Ρ ΠΈ ΠΈΠ³ΡΠ°ΡΠ° ΡΡΠ°Π½Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°, ΡΠΎΠ³Π°Π²Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΡΠ΅ Π½Π°Π΄Π³ΡΠ°ΠΆΠ΄Π°.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, Π²ΡΠ΅ ΠΎΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²ΡΠ½ΡΠ½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°:
- ΠΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ 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 ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅ ΠΈ ΠΌΡΡΠ·Π΅Π»ΠΈΠ²Π° Π²ΡΡΠ·ΠΊΠ°.
Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ
ΠΠΎΡΠΈ Π°ΠΊΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π΅Π±Π»ΠΎΠΊΠΈΡΠ°Ρ I/O, ΠΊΠΎΠ΄ΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠ΅Π½, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π² ΡΠ΅Π± Π±ΡΠ°ΡΠ·ΡΡ.
ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΡΠΎΠ²Π° Π΅, ΡΠ΅ ΡΠΈΠΊΡΠ»ΡΡ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π΅ ΡΠΊΡΠΈΡ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° (Π±ΠΈΠ»ΠΎ ΡΠΎ JavaScript ΠΈΠ»ΠΈ WebAssembly).
Π Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π° ΡΡΠ΅Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ΄ ΠΊΠ°ΡΠΎ ΡΠΎΠ·ΠΈ
while(running) {
select(...); // wait for I/O events
while(true) {
int r = readfrom(...); // try to read
if (r < 0 && errno == EWOULDBLOCK) // no more data available
break;
...
}
...
}
ΠΠΊΠΎ ΡΠΈΠΊΡΠ»ΡΡ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Π΅ ΡΠΊΡΠΈΡ Π·Π° Π½Π°Ρ, ΡΠΎΠ³Π°Π²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΏΡΠ΅Π²ΡΡΠ½Π΅ΠΌ Π² Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:
auto cb = []() { // this will be called when new data is available
while(true) {
int r = readfrom(...); // try to read
if (r < 0 && errno == EWOULDBLOCK) // no more data available
break;
...
}
...
};
recvCallback(cb); // register the callback
ΠΠΎΠΊΠ°Π»Π½ΠΎ IP ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅
ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈΡΠ΅ Π½Π° Π²ΡΠ·Π»ΠΈΡΠ΅ Π² Π½Π°ΡΠ°ΡΠ° βΠΌΡΠ΅ΠΆΠ°β Π½Π΅ ΡΠ° IP Π°Π΄ΡΠ΅ΡΠΈ, Π° ΠΊΠ»ΡΡΠΎΠ²Π΅ Π½Π° Firebase (ΡΠΎΠ²Π° ΡΠ° Π½ΠΈΠ·ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ ΡΠ°ΠΊΠ°: -LmEC50PYZLCiCP-vqde
).
Π’ΠΎΠ²Π° Π΅ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π·Π°ΡΠΎΡΠΎ Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅ Π½Π° IP Π°Π΄ΡΠ΅ΡΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°Π»ΠΈ ΡΠ° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ (ΠΈ Π΄Π° Π³ΠΈ ΠΈΠ·Ρ Π²ΡΡΠ»ΠΈΠΌ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ ΠΏΡΠ΅ΠΊΡΡΠ½Π΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ°), Π½ΠΎ ΡΠ΅ΡΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈΡΠ΅ ΡΡΠ΅Π· ΡΠΈΡΠ»ΠΎΠ²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ.
ΠΠ° ΡΠΎΠ²Π° ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅. resolve
ΠΈ reverseResolve
: ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° Π½ΠΈΠ·Π° Π½Π° ΠΊΠ»ΡΡΠ° (ΡΡΠ΅Π· Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΡΡΠ΅Π· Π³Π»Π°Π²Π½ΠΈΡ ΡΡΡΠ²ΡΡ) ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π° Π² IP Π°Π΄ΡΠ΅Ρ Π·Π° Π²ΡΡΡΠ΅ΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°. ΠΡΡΠ°Π½Π°Π»Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ API ΡΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΠ°Π·ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡ Π²ΠΌΠ΅ΡΡΠΎ Π½ΠΈΠ· Π·Π° ΠΏΡΠΎΡΡΠΎΡΠ°.
Π’ΠΎΠ²Π° Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° DNS ΡΡΡΡΠ΅Π½Π΅, ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ΅ ΡΠ°ΠΌΠΎ Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
Π’ΠΎΠ΅ΡΡ IP Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠΏΠΎΠ΄Π΅Π»ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ ΠΈ Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π½ΡΠΊΠ°ΠΊΡΠ² Π³Π»ΠΎΠ±Π°Π»Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΠΎΠΉ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½.
ΠΡΡΠ·Π΅Π»ΠΈΠ²ΠΎ ΠΏΡΠΈΡΡΠ΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅
UDP Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ Π²ΡΡΠ·ΠΊΠ°, Π½ΠΎ ΠΊΠ°ΠΊΡΠΎ Π²ΠΈΠ΄ΡΡ ΠΌΠ΅, WebRTC ΠΈΠ·ΠΈΡΠΊΠ²Π° Π΄ΡΠ»ΡΠ³ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»Ρ Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²Π°ΠΌΠ° ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈ.
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈΠΌ ΡΡΡΠΎΡΠΎ Π½ΠΈΠ²ΠΎ Π½Π° Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ, (sendto
/recvfrom
Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈ Π±Π΅Π· ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅), ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²ΡΡΡΠ°Ρ βΠΌΡΡΠ·Π΅Π»ΠΈΠ²Π°β (Π·Π°Π±Π°Π²Π΅Π½Π°) Π²ΡΡΠ·ΠΊΠ° Π²ΡΡΡΠ΅ Π² API.
ΠΡΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΠΏΡΠΈ Π½ΠΎΡΠΌΠ°Π»Π½Π°ΡΠ° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ "ΡΡΡΠ²ΡΡΠ°" ΠΈ "ΠΊΠ»ΠΈΠ΅Π½ΡΠ°" Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° UDP ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ°Π²ΠΈ Π½Π°ΡΠ°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°:
- Π‘ΡΡΠ²ΡΡΠ½ΠΈ ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ
bind()
Π·Π° Π΄Π° ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΠ΅ ΠΈΡΠΊΠ° Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΡ.
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌΠ΅ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΏΠΎΡΡ ΠΊΡΠΌ Firebase ΠΏΠΎΠ΄ ΠΊΠ»ΡΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° ΠΈ ΡΠ΅ ΡΠ»ΡΡΠ°ΠΌΠ΅ Π·Π° ΡΡΠ±ΠΈΡΠΈΡ Π² Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠ²ΠΎ.
- Π‘ΡΡΠ²ΡΡΠ½ΠΈ ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ
recvfrom()
, ΠΏΡΠΈΠ΅ΠΌΠ°ΠΉΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ Π²ΡΠ΅ΠΊΠΈ Ρ ΠΎΡΡ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ.
Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π²Ρ ΠΎΠ΄ΡΡΠ°ΡΠ° ΠΎΠΏΠ°ΡΠΊΠ° ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΈ Π΄ΠΎ ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ.
ΠΡΠ΅ΠΊΠΈ ΠΏΠΎΡΡ ΠΈΠΌΠ° ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΠΎΠΏΠ°ΡΠΊΠ° ΠΈ Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΏΠΎΡΡΠΎΠ²Π΅ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ ΠΈ Π΄Π΅ΡΡΠΈΠ½Π°ΡΠΈΡ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° WebRTC Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΈΡΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° Π·Π½Π°Π΅ΠΌ ΠΊΡΠΌ ΠΊΠΎΡ ΠΎΠΏΠ°ΡΠΊΠ° Π΄Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠΈΠΌ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΈΡΡΠΈΠ³Π½Π΅ Π½ΠΎΠ² ΠΏΠ°ΠΊΠ΅Ρ.
ΠΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π΅ Π΅ Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ Π°ΠΊΠΎ Π½ΡΠΌΠ° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΏΡΠΎΡΡΠΎ Π²ΡΡΡΠ°ΠΌΠ΅ -1 ΠΈ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ errno=EWOULDBLOCK
.
- ΠΠ»ΠΈΠ΅Π½ΡΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π²ΡΠ½ΡΠ΅Π½ Π½Π°ΡΠΈΠ½ IP ΠΈ ΠΏΠΎΡΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° ΠΈ ΡΠ΅ ΠΎΠ±Π°ΠΆΠ΄Π°
sendto()
. Π’ΠΎΠΉ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠ·Π²ΡΡΡΠ²Π° Π²ΡΡΡΠ΅ΡΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅bind()
, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΡrecvfrom()
ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° Π±Π΅Π· ΠΈΠ·ΡΠΈΡΠ½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° bind.
Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ Π²ΡΠ½ΡΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΊΠ»ΡΡ ΠΎΡ Π½ΠΈΠ· ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° resolve()
Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ IP Π°Π΄ΡΠ΅Ρ.
Π ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ WebRTC ΡΡΠΊΠΎΡΡΠΈΡΠΊΠ°Π½Π΅ΡΠΎ, Π°ΠΊΠΎ Π΄Π²Π°ΠΌΠ°ΡΠ° ΠΏΠ°ΡΡΠ½ΡΠΎΡΠΈ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Π΅Π΄ΠΈΠ½ Ρ Π΄ΡΡΠ³. ΠΡΡΠ·ΠΊΠΈΡΠ΅ ΠΊΡΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΡΡΠΎΠ²Π΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ ΠΏΠ°ΡΡΠ½ΡΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ WebRTC DataChannel.
ΠΡΠ°Π²ΠΈΠΌ ΠΈ ΠΈΠ½Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΈ bind()
ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΡΠ²ΡΡΡΡ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° sendto()
Π² ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΡΠ΅ Π·Π°ΡΠ²ΠΎΡΠΈ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π°.
Π‘ΡΡΠ²ΡΡΡΡ ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΡΠ²Π° Π·Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ Π½Π°ΠΏΠΈΡΠ΅ ΡΠ²ΠΎΡΡΠ° SDP ΠΎΡΠ΅ΡΡΠ° ΠΏΠΎΠ΄ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΡΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° Π²ΡΠ² Firebase ΠΈ ΡΡΡΠ²ΡΡΡΡ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Ρ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° ΡΠΈ ΠΈ ΡΠ°ΠΌ.
ΠΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΏΠΎΡΠΎΠΊ ΠΎΡ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° ΡΡ Π΅ΠΌΠ°ΡΠ° Π½Π° ΡΠΎΠΊΠ΅ΡΠ° ΠΈ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΊΡΠΌ ΡΡΡΠ²ΡΡΠ°:
ΠΡΠ»Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π½Π° ΡΠ°Π·Π°ΡΠ° Π½Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΡΡΠ²ΡΡ
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΊΠΎ ΡΡΠ΅ ΠΏΡΠΎΡΠ΅Π»ΠΈ Π΄ΠΎ ΡΡΠΊ, ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅ΠΎΡΠΈΡΡΠ° Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΠ³ΡΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ³ΡΠ°Π΅ Π½Π°
ΠΡΠΈΡΡΠ΅Π»ΡΠΊΠΈ ΠΌΠ°Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ»Π΅Π³ΠΈ
ΠΠΎΠ΄ΡΡ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π°
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com