์๊ฐ
์ฐ๋ฆฌ ํ์ฌ
๊ทธ ์ ์ฉ ์ฌ๋ก๋ก์ ์ฐ๋ฆฌ๋ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์์ ์น์ผ๋ก ํฌํ
ํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ์ด๋ฅผ ์ ํํ์ต๋๋ค.
Teeworlds ๋ธ๋ผ์ฐ์ ์์ ์คํ
์ฐ๋ฆฌ๋ ์ด ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์คํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋คํธ์ํฌ ์ฝ๋๋ฅผ ์น์ผ๋ก ํฌํ
ํ๊ธฐ ์ํ ์ผ๋ฐ์ ์ธ ์๋ฃจ์
. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ํ๋ฉ๋๋ค.
- XMLHttp์์ฒญ/๊ฐ์ ธ์ค๊ธฐ, ๋คํธ์ํฌ ๋ถ๋ถ์ด HTTP ์์ฒญ์ผ๋ก๋ง ๊ตฌ์ฑ๋ ๊ฒฝ์ฐ, ๋๋
- WebSocket์.
๋ ์๋ฃจ์
๋ชจ๋ ์๋ฒ ์ธก์์ ์๋ฒ ๊ตฌ์ฑ ์์๋ฅผ ํธ์คํ
ํด์ผ ํ๋ฉฐ ๋ ๋ค ์ ์ก ํ๋กํ ์ฝ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ์ถ๊ฐ์ ์ธ ์ด๋ ค์์ด ๋ฐ๋ฆ
๋๋ค. ๋ WebRTC ํผ์ด๊ฐ ํต์ ํ ์ ์์ผ๋ ค๋ฉด ๋น๊ต์ ๋ณต์กํ ํธ๋์
ฐ์ดํฌ๋ฅผ ์ํํ์ฌ ์ฐ๊ฒฐํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์ํด์๋ ์ฌ๋ฌ ํ์ฌ ์ํฐํฐ(์ ํธ ์๋ฒ ๋ฐ ํ๋ ์ด์์ ์๋ฒ)๊ฐ ํ์ํฉ๋๋ค.
์ด์์ ์ผ๋ก๋ ๋ด๋ถ์ ์ผ๋ก WebRTC๋ฅผ ์ฌ์ฉํ์ง๋ง ์ฐ๊ฒฐ์ ์ค์ ํ ํ์๊ฐ ์๋ UDP ์์ผ ์ธํฐํ์ด์ค์ ์ต๋ํ ๊ฐ๊น์ด ๋คํธ์ํฌ API๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋ณต์กํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ ธ์ถํ์ง ์๊ณ ๋ WebRTC๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค(์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ ์ด๋ฅผ ๊ฐ๋ฅํ ํ ์ ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ถ์์ต๋๋ค).
์ต์ WebRTC
WebRTC๋ ์ค๋์ค, ๋น๋์ค ๋ฐ ์์ ๋ฐ์ดํฐ์ PXNUMXP ์ ์ก์ ์ ๊ณตํ๋ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ ์ ์๋ API ์ธํธ์ ๋๋ค.
ํผ์ด ๊ฐ์ ์ฐ๊ฒฐ์ ICE๋ผ๋ ๋ฉ์ปค๋์ฆ์ ํตํด STUN ๋ฐ/๋๋ TURN ์๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ (ํ์ชฝ ๋๋ ์์ชฝ์ NAT๊ฐ ์๋๋ผ๋) ์ค์ ๋ฉ๋๋ค. ํผ์ด๋ SDP ํ๋กํ ์ฝ์ ์ ์ ๋ฐ ์๋ต์ ํตํด ICE ์ ๋ณด ๋ฐ ์ฑ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ตํํฉ๋๋ค.
์ฐ์! ํ ๋ฒ์ ๋ช ๊ฐ์ ์ฝ์ด๊ฐ ์์ต๋๊น? ์ด ์ฉ์ด์ ์๋ฏธ๋ฅผ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
NAT์ฉ ์ธ์ ์ํ ์ ํธ๋ฆฌํฐ (์ถฉ๊ฒฉ) โ NAT๋ฅผ ์ฐํํ๊ณ ํธ์คํธ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ธฐ ์ํ ์(IP, ํฌํธ)์ ์ป๊ธฐ ์ํ ํ๋กํ ์ฝ์ ๋๋ค. ๊ทธ๊ฐ ์์ ์ ์๋ฃํ๋ฉด ๋๋ฃ๋ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์์ต๋๋ค.NAT ์ฃผ๋ณ์ ๋ฆด๋ ์ด๋ฅผ ์ฌ์ฉํ ์ํ (ํ์ ) NAT ํต๊ณผ์๋ ์ฌ์ฉ๋์ง๋ง ๋ ํผ์ด ๋ชจ๋์๊ฒ ํ์๋๋ ํ๋ก์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ์ฌ ์ด๋ฅผ ๊ตฌํํฉ๋๋ค. STUN๋ณด๋ค ๋๊ธฐ ์๊ฐ์ด ์ถ๊ฐ๋๊ณ ๊ตฌํ ๋น์ฉ์ด ๋ ๋์ง๋ง(์ ์ฒด ํต์ ์ธ์ ์ ๊ฑธ์ณ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์) ๋๋ก๋ ์ด๊ฒ์ด ์ ์ผํ ์ต์ ์ด๊ธฐ๋ ํฉ๋๋ค.์ธํฐ๋ํฐ๋ธ ์ปค๋ฅํฐ๋นํฐ ๊ตฌ์ถ (ICE) ํผ์ด๋ฅผ ์ง์ ์ฐ๊ฒฐํ์ฌ ์ป์ ์ ๋ณด์ ๋ค์์ STUN ๋ฐ TURN ์๋ฒ์์ ์์ ํ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ํผ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.์ธ์ ์ค๋ช ํ๋กํ ์ฝ (SDP) ICE ํ๋ณด, ๋ฉํฐ๋ฏธ๋์ด ์ฝ๋ฑ(์ค๋์ค/๋น๋์ค ์ฑ๋์ ๊ฒฝ์ฐ) ๋ฑ๊ณผ ๊ฐ์ ์ฐ๊ฒฐ ์ฑ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ค๋ช ํ๊ธฐ ์ํ ํ์์ ๋๋ค. ํผ์ด ์ค ํ๋๋ SDP Offer๋ฅผ ๋ณด๋ด๊ณ ๋ ๋ฒ์งธ๋ SDP Answer๋ก ์๋ตํฉ๋๋ค. ... ๊ทธ ํ ์ฑ๋์ด ์์ฑ๋ฉ๋๋ค.
์ด๋ฌํ ์ฐ๊ฒฐ์ ์์ฑํ๋ ค๋ฉด ํผ์ด๋ STUN ๋ฐ TURN ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ ๋ณด๋ฅผ ์์งํ๊ณ ์ด๋ฅผ ์๋ก ๊ตํํด์ผ ํฉ๋๋ค.
๋ฌธ์ ๋ ์์ง ์ง์ ํต์ ํ ์ ์๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ ค๋ฉด ์ ํธ ์๋ฒ๋ผ๋ ๋์ญ ์ธ ๋ฉ์ปค๋์ฆ์ด ์กด์ฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ ํธ ์๋ฒ๋ ์ ์ผํ ์์ ์ด ํธ๋์ ฐ์ดํฌ ๋จ๊ณ์์ ํผ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด๋ฏ๋ก ๋งค์ฐ ๊ฐ๋จํ ์ ์์ต๋๋ค(์๋ ๋ค์ด์ด๊ทธ๋จ ์ฐธ์กฐ).
๋จ์ํ๋ WebRTC ํธ๋์
ฐ์ดํฌ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ
Teeworlds ๋คํธ์ํฌ ๋ชจ๋ธ ๊ฐ์
Teeworlds ๋คํธ์ํฌ ์ํคํ ์ฒ๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ตฌ์ฑ ์์๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ง ํ๋ก๊ทธ๋จ์ ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ํ ๋ฒ์ ํ๋์ ๊ฒ์๋ง ํธ์คํ ํ๋ ์ฌ๋ฌ ์๋ฒ ์ค ํ๋์ ์ฐ๊ฒฐํ์ฌ ๊ฒ์์ ๋ค์ด๊ฐ๋๋ค.
- ๊ฒ์ ๋ด ๋ชจ๋ ๋ฐ์ดํฐ ์ ์ก์ ์๋ฒ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
- ๊ฒ์ ํด๋ผ์ด์ธํธ์ ํ์๋๋ ๋ชจ๋ ๊ณต์ฉ ์๋ฒ ๋ชฉ๋ก์ ์์งํ๊ธฐ ์ํด ํน์ ๋ง์คํฐ ์๋ฒ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ์ดํฐ ๊ตํ์ ์ํด WebRTC๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฒ์์ ์๋ฒ ๊ตฌ์ฑ ์์๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํ ์ ์์ต๋๋ค. ์ด๋ ์ฐ๋ฆฌ์๊ฒ ์ข์ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค...
์๋ฒ๋ฅผ ์์ ์ธ์
์๋ฒ ๋ก์ง์ด ์๋ค๋ ์ ์ ์ข์ ์ฅ์ ์ด ์์ต๋๋ค. Github ํ์ด์ง๋ Cloudflare ๋ค์ ์์ฒด ํ๋์จ์ด์ ์ ์ ์ฝํ ์ธ ๋ก ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์ ์์ผ๋ฏ๋ก ๋ฌด๋ฃ๋ก ๋น ๋ฅธ ๋ค์ด๋ก๋์ ๋์ ๊ฐ๋ ์๊ฐ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ฌ์ค, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ์์ด๋ฒ๋ฆด ์ ์์ผ๋ฉฐ ์ด์ด ์ข๊ณ ๊ฒ์์ด ์ธ๊ธฐ๋ฅผ ์ป๊ฒ ๋๋ค๋ฉด ์ธํ๋ผ๋ฅผ ํ๋ํํ ํ์๊ฐ ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์์คํ ์ด ์๋ํ๋ ค๋ฉด ์ฌ์ ํ ์ธ๋ถ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ํ๋ ์ด์์ STUN ์๋ฒ: ์ ํํ ์ ์๋ ๋ช ๊ฐ์ง ๋ฌด๋ฃ ์ต์ ์ด ์์ต๋๋ค.
- ์ต์ ํ๋์ TURN ์๋ฒ: ์ฌ๊ธฐ์๋ ๋ฌด๋ฃ ์ต์ ์ด ์์ผ๋ฏ๋ก ์์ฒด์ ์ผ๋ก ์ค์ ํ๊ฑฐ๋ ์๋น์ค ๋น์ฉ์ ์ง๋ถํ ์ ์์ต๋๋ค. ๋คํ์ค๋ฝ๊ฒ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ STUN ์๋ฒ๋ฅผ ํตํด ์ฐ๊ฒฐ์ ์ค์ ํ ์ ์์ง๋ง(๋ฐ ์ง์ ํ p2p ์ ๊ณต) ๋์ฒด ์ต์ ์ผ๋ก TURN์ด ํ์ํฉ๋๋ค.
- ์๊ทธ๋๋ง ์๋ฒ: ๋ค๋ฅธ ๋ ๊ฐ์ง ์ธก๋ฉด๊ณผ ๋ฌ๋ฆฌ ์๊ทธ๋๋ง์ ํ์คํ๋์ง ์์ต๋๋ค. ์๊ทธ๋๋ง ์๋ฒ๊ฐ ์ค์ ๋ก ๋ด๋นํ๋ ์ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ฐ๊ฒฐ์ ์ค์ ํ๊ธฐ ์ ์ ์๋์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํด์ผ ํฉ๋๋ค.
- Teeworlds ๋ง์คํฐ ์๋ฒ: ๋ค๋ฅธ ์๋ฒ์์ ์์ ์ ์กด์ฌ๋ฅผ ์๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ๊ณต์ฉ ์๋ฒ๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ์๋ ์๋์ง๋ง(ํด๋ผ์ด์ธํธ๋ ํญ์ ์๋์ผ๋ก ์๊ณ ์๋ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์) ํ๋ ์ด์ด๊ฐ ์์์ ์ฌ๋๋ค๊ณผ ๊ฒ์์ ์ฐธ์ฌํ ์ ์๋๋ก ํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ Google์ ๋ฌด๋ฃ STUN ์๋ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ํ๋์ TURN ์๋ฒ๋ฅผ ์ง์ ๋ฐฐํฌํ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ง์ง๋ง ๋ ์ ์ ๋ํด
- Teeworlds ๋ง์คํฐ ์๋ฒ๋ ๊ฐ ํ์ฑ ์๋ฒ์ ์ ๋ณด(์ด๋ฆ, IP, ์ง๋, ๋ชจ๋ ๋ฑ)๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด ๋ชฉ๋ก์ผ๋ก ๋งค์ฐ ๊ฐ๋จํ๊ฒ ๊ตฌํ๋ฉ๋๋ค. ์๋ฒ๋ ์์ฒด ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๊ณ ์ ๋ฐ์ดํธํ๋ฉฐ ํด๋ผ์ด์ธํธ๋ ์ ์ฒด ๋ชฉ๋ก์ ๊ฐ์ ธ์ ํ๋ ์ด์ด์ ํ์ํฉ๋๋ค. ๋ํ ํ๋ ์ด์ด๊ฐ ์๋ฒ๋ฅผ ํด๋ฆญํ๊ธฐ๋ง ํ๋ฉด ๋ฐ๋ก ๊ฒ์์ผ๋ก ์ด๋ํ ์ ์๋๋ก ํ ํ์ด์ง์ ๋ชฉ๋ก์ HTML๋ก ํ์ํฉ๋๋ค.
- ์ ํธ๋ ๋ค์ ์น์ ์์ ์ค๋ช ํ๋ ์์ผ ๊ตฌํ๊ณผ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ต๋๋ค.
๊ฒ์ ๋ด๋ถ ๋ฐ ํํ์ด์ง์ ์๋ฒ ๋ชฉ๋ก
์์ผ ๊ตฌํ
์ฐ๋ฆฌ๋ ํ์ํ ๋ณ๊ฒฝ ํ์๋ฅผ ์ต์ํํ๊ธฐ ์ํด Posix UDP ์์ผ์ ์ต๋ํ ๊ฐ๊น์ด API๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
๋ํ ์ฐ๋ฆฌ๋ ๋คํธ์ํฌ๋ฅผ ํตํ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ตํ์ ํ์ํ ์ต์ํ์ ์๊ตฌ ์ฌํญ์ ๊ตฌํํ๋ ค๊ณ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ค์ ๋ผ์ฐํ ์ด ํ์ํ์ง ์์ต๋๋ค. ๋ชจ๋ ํผ์ด๋ ํน์ Firebase ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค์ ์ฐ๊ฒฐ๋ ๋์ผํ "๊ฐ์ LAN"์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ณ ์ ํ 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๋ ๊ฐ๋จํ๊ณ 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 ํ ๋น
"๋คํธ์ํฌ"์ ๋
ธ๋ ID๋ 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()
๋ช ์์ ์ผ๋ก ๋ฐ์ธ๋๋ฅผ ์คํํ์ง ์๊ณ ์๋ต์ ๋ฐ์ต๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์ธ๋ถ์์ ๋ฌธ์์ด ํค๋ฅผ ์์ ํ๊ณ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. resolve()
IP ์ฃผ์๋ฅผ ์ป์ผ๋ ค๋ฉด.
์ด ์์ ์์ ๋ ํผ์ด๊ฐ ์์ง ์๋ก ์ฐ๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ WebRTC ํธ๋์ ฐ์ดํฌ๋ฅผ ์์ํฉ๋๋ค. ๋์ผํ ํผ์ด์ ๋ค๋ฅธ ํฌํธ์ ๋ํ ์ฐ๊ฒฐ์ ๋์ผํ WebRTC DataChannel์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ ์ ์ผ๋ก ์ํํ๊ธฐ๋ ํฉ๋๋ค. bind()
๋ค์์ ์๋ฒ๊ฐ ๋ค์ ์ฐ๊ฒฐ๋ ์ ์๋๋ก sendto()
์ด๋ค ์ด์ ๋ก๋ ๋ฌธ์ ๋ซ์ ๊ฒฝ์ฐ.
ํด๋ผ์ด์ธํธ๊ฐ Firebase์ ์๋ฒ ํฌํธ ์ ๋ณด ์๋์ SDP ์ ์์ ์์ฑํ ๋ ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ ๋ํ ์๋ฆผ์ ๋ฐ๊ณ , ์๋ฒ๋ ๊ฑฐ๊ธฐ์ ๋ํ ์๋ต์ผ๋ก ์๋ตํฉ๋๋ค.
์๋ ๋ค์ด์ด๊ทธ๋จ์ ์์ผ ๊ตฌ์ฑํ์ ๋ํ ๋ฉ์์ง ํ๋ฆ์ ์์ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก์ ์ฒซ ๋ฒ์งธ ๋ฉ์์ง ์ ์ก์ ๋ณด์ฌ์ค๋๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ฐ๊ฒฐ ๋จ๊ณ์ ๋ํ ์ ์ฒด ๋ค์ด์ด๊ทธ๋จ
๊ฒฐ๋ก
์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์๋ง๋ ์ด๋ก ์ด ์ค์ ๋ก ์๋ํ๋ ๋ชจ์ต์ ๋ณด๋ ๋ฐ ๊ด์ฌ์ด ์์ ๊ฒ์
๋๋ค. ๊ฒ์์ ๋ค์์์ ํ๋ ์ดํ ์ ์์ต๋๋ค.
๋๋ฃ๊ฐ์ ์น์ ๊ฒฝ๊ธฐ
๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๋ ๋ค์์์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com