ááá˘áŤ
á¨áĽá áŠáŁááŤ
áĽáá° áľáá áŤá ááłáᣠáŁááĽá á°áŤáá˝ á¨ááłá áá° áľáŠ áááľá¨áľ ááľáá áá¨áĽáá˘
á Teeworlds á áłá˝ ááľáĽ á ááľáŤáľ áá
áá
áá ááŽáááľ áááá¨á ááľááá á¨á ááłá¨ áá¨áĽ áŽáľ áá° áľáŠ áááľá°ááá á á ááá áááľááá˝. áá
áĽááá áá á áá¨á°ááľ ááááśá˝ áá¨áááá.
- XMLHttpáĽáŤá/á ááŁá¨á ááłá¨ áá¨áĄ ááá á¨á¤á˝á˛á˛á áĽáŤááá˝á áĽáť áŤáŤá°á° á¨áá ááá
- ááĽáłááśá˝.
áááąá áááľááá˝ á¨á áááá á áŤáá á á áááአá áŠá ááľá°áááľá áá ááá, áĽá áĽáá° á¨áľáŤááľáááľ ááŽáśáŽá á ááłá¸áá á ááááąá
áŚáľá°áá ááááľ á á - á ááłá¨ áá¨áĄá á¨á áłáš áá áá-
ááá áá
á¨á°á¨á᪠á˝áá áá á áĽáŽ áááŁááĄ- áááľ á¨ááĽá áá˛á˛ áĽáŠáŽá˝ á¨áááááłá¸á á ááľ ááááááľ á á áááŤáááľ ááľáĽáľáĽ á¨áá á¨áĽá
áá¨áŁá ἠááľá¨á á ááŁá¸áᣠáá
á á ááŤáł á¨áśáľá°á ááá á áŤááľá áá ááá (ááááľ á°áŞ á áááá áĽá á ááľ ááá á¨á፠á áá á ááááŽá˝)á˘
á ááłáĽ á°á¨áᣠWebRTCá á ááľáĽ á áŠá á¨áá áá á¨á ááłá¨ áá¨áĽ á¤áá á ááá á áĽáááááááŁááá áá áááááľ áááĽá¨áľ áá°áááááá á¨UDP Sockets á áááá˝ á á°áťá áá á á áἠááá˘
áá ááľáĽáľáĽ ááááŽá˝á áá° á áááŹá˝á áŽáľ (á ááŽáááłá˝á ááľáĽ á á°áťá áá á áľáá˝ áááἠá¨áááááá) áłáááἠᨠWebRTC á°á áá áĽááľááá áŤáľá˝ááá.
áá á°áá WebRTC
WebRTC á á áłážá˝ ááľáĽ á¨ááá á¨áŚá˛áŽáŁ áŞá˛áŽ áĽá á¨áááá° ááἠá¨á áť áá áť ááľá°ááá á¨ááŤááἠá¨á¤áá ááá˝ áľáĽáľáĽ ááá˘
á á áťáá˝ ááŤá¨á áŤáá áááááľ STUN áĽá/ááá TURN á ááááŽá˝á á áá áá ICE á á°áŁá áá´ (á á ááą ááá á áááąá á áŠá NAT á˘ááá) ááá°á¨áłáᢠáĽáŠáŽá˝ ᨠICE áá¨áá áĽá á¨á°áἠáááŞáŤáá˝á á SDP ááŽáśáŽá á á ááŚáľ áĽá áááľ áááááŁáá˘
áá! á á ááľ áá áľááľ á á á˝áŽá° áááľ? áĽááá áááľ áá áááľ áĽáá°áá áŁáአáĽááĽáŤáŤáĄ-
á¨ááá-áá ááťááŞáŤ áááááŤáá˝ á NAT (STUN) - NATá áááá áĽá áĽááľ áááááľ (á áá ᣠáá°áĽ) á ááĽáł á¨á áľá°ááá áá ááἠáááááἠááŽáśáŽá ᢠáľáŤáá áá¨á¨áľ á¨áťá áĽáŠáŽáš á á°ááĽá áĽááľ á áĽááľ áá¨á ááááἠáá˝ááá˘á NAT ááŞáŤ á áĽáĽáá˝ á áá áá ááťáá (á°áŤ) á NAT ááťááŞáŤá áĽá á áá ááááᣠááá áá áá áá á°ááŁáŤá á¨ááŤá°ááá ááááąá áĽáŠáŽá˝ á ááłá á°áŞ á áŠá á ááľá°ááá ááᢠáááá¨áľá áá¨ááŤá áĽá ᨠSTUN ááá ááá°áá á á áŁá ááľ áá (ááááŤáąá á á á ááá á¨áááááľ ááá áá ááľáĽ áľááá°áá á) ᣠáá á ááłááľ áá áĽá¸áá á ááŤá ááá˘á ááá°ááá áááááľ áááľá¨áľ (ICE) áĽáŠáŽá˝á á ááĽáł á¨áááááľ á á°áá áá¨á áĽá á ááááá ᨠSTUN áĽá TURN á ááááŽá˝ á á°áá áá áá¨á áá á áááľá¨áľ áááľ áĽáŠáŽá˝á á¨áááááľ áááĄá áá´ áááá¨áĽ áá á ááá˘á¨ááá áá ááá፠ááŽáśáŽá (SDP) á¨áááááľ áťáá áááŞáŤáá˝á á¨áááá˝ á áá¸áľ áá ᣠáááłá ᣠᨠICE áĽáŠáὠᣠá¨ááá˛áá˛áŤ áŽá´áŽá˝ (á áľáá˝ / áŞá˛áŽ áťáá) ááá° ... á¨áĽáŠáŤááš á áṠᨠSDP á á ááŚáľá áááŤá ᣠááá°áá á°áá á SDP áááľ áá°áŁá ᢠ. á¨áá á áá áťáá ááá áŤáá˘
áĽáá°áá á áááľ áááááľ áááá á áĽáŠáŽá˝ ᨠSTUN áĽá TURN á ááááŽá˝ á¨á°áá ááľá áá¨á áá°áĽá°áĽ áĽá áĽááľ á áĽááľ ááááἠá ááŁá¸á.
á˝áአáĽáľáŤáá á ááĽáł á¨áááŁá˘áŤ á˝ááł áľáááá¸á áá á ááἠáááááἠá¨áŁááą á᪠á¨áá áá´ ááá á áá áľáĄ ááááľ á°áŞ á ááááá˘
á¨ááááľ á°áŞ á áááá á áŁá ááá ááá áá˝áá ááááŤáąá áľáŤá á áá¨áŁá ἠáá°áľ (á¨áłá˝ áŁáá áľáĽá áĽáá°ááłá¨á) á áĽáŠáŽá˝ ááŤá¨á áŤááá áá¨á ááľá°ááá áĽáť ááá˘
ááá áŤá WebRTC á¨áá¨áŁá ἠá
á°á á°á¨á°á ááľá
Teeworlds á ááłá¨ áá¨áĽ áá´á á á ááá áĽááł
Teeworlds á ááłá¨ áá¨áĽ á ááá´áá¸á á áŁá ááá áááĄ-
- á°áá áá áĽá á¨á áááá á áŤááľ áááľ á¨á°ááŤáŠ ááŽááŤáá˝ áá¸á.
- á°áá áá˝ áá° á¨ááłá á¨áááĄáľ á¨á ááŤáł á ááááŽá˝ áá° á ááą á áááááľ á˛áá áĽáŤááłááłá¸á á á ááľ áá á ááľ á¨ááł áĽáť áŤáľá°áááłáá˘
- á á¨ááłá ááľáĽ ááá á¨ááἠááľá°ááá á á áááአá áŠá ááŤááłá.
- áአááľá°á á áááá á á¨ááł á°áá á ááľáĽ á¨ááłáŠáľá áááá á¨á áἠá ááááŽá˝ áááá ááá°áĽá°áĽ áá á ááá˘
ááá¨á áááἠWebRTC á á ááá ááľáá áááŁáá á¨á¨ááłáá á¨á áááá á áŤá á°áá áá áá°áááá áľ á áłá˝ ááľá°ááá áĽáá˝áááᢠáá áľáá áĽáľá áá°á áá ...
á ááááŽá˝á áŤáľáááą
á¨á áááá á áááᎠá áááá áĽáŠ á áááł á ááᥠá áááŹá˝áá á áá áĽáá° áá áááľ á Github Pages ááá á áŤáłá˝á áááľáá ᨠCloudflare ááᣠáá°ááŤáľ áĽáá˝áááᣠá áá á ááŁá ááá¨áśá˝á áĽá á¨áá°á á¨áľáŤ ááá á ááť áá¨ááἠáĽáá˝áááᢠáĽáá°áá áĽáááąá ááá¨áłá¸á áĽáá˝ááá áĽá áĽáľááá˝ á¨ááá áĽá á¨ááłá á°ááłá á¨áá áá°á¨á° áááą áááá ááá á¨áá áľáá˘
ááá ááᣠáľáááą áĽáá˛á°áŤáŁ á ááá ááŤá á ááá´áá¸áá áá áá á ááĽááĄ-
- á ááľ ááá á¨á፠á áá ᨠSTUN á ááááŽá˝áĄ á¨áááááŁá¸á áĽá ááť á ááŤáŽá˝ á ááá˘
- á˘áŤááľ á áᾠᨠTURN á ááááᥠáĽáá ááá ááť á ááŤáŽá˝ áľááá á¨áŤáłá˝áá áááá ááá áá áááááą áááá áĽáá˝áááᢠáĽáá° áĽáľá ááᣠáĽá áá áááááą á STUN á ááááŽá˝ á áŠá ááá°á¨áľ áá˝áá (áĽá áĽááá°á p2p áŤá ááĄ)ᣠááá áá TURN áĽáá° ááľááľ á ááŤá áŤáľááááá˘
- á¨ááááľ á°áŞ á ááááᥠá¨áááš áááľ áá˝áłáá˝ á á°áᨠááአááááľ ááľá áľ á°á¨ááá á¨á á á á áá°ááᢠá¨ááááľ á°áŞá á áááአá°á áŤá á¨áááá á áá°áá áŞáŤá áá á áá á ááá°ááᢠá áĽá áááł, áááááľ á¨áááĽá¨áľá á ááľ, á ááľá°á áá á áŤáá áá¨á ááááἠá áľááá áá.
- Teeworlds ááľá°á á áááááĄ- á áááá¸áá áááľá°ááá áĽá á á°áá áá˝ á¨á áἠá ááááŽá˝á áááááľ á ááá˝ á ááááŽá˝ áĽá á áá ááááᢠá áľááá áŁáááá (á°áá áá˝ áá áá á áĽá á¨ááŤáááľ á áááá áá áááááľ áá˝áá) ᣠá°áŤáážá˝ á áááá° á°áá˝ ááľáĽ áŁá á¨ááłáá˝ ááľáĽ áĽáá˛áłá°á ááľá¨á áĽáŠ ááá˘
á¨Google áá STUN á ááááŽá˝á ááá áá ááľáááᣠáĽá á ááľ TURN á áááá áĽáŤáłá˝áá á á°ááá°ááá˘
ááá¨á¨áťááš áááľ ááĽáŚá˝ á°á áááá˘
- á¨Teeworlds ááľá°á á áááá á áŁá ááá áá á¨áá°áá á¨áᥠáĽáá° áĽáŤááłááą áá á áááá áá¨á (áľáᣠá ááᣠáŤááłáŁ áááłáŁ ...) á¨áŤá áááŽá˝ áááá ááᢠá ááááŽá˝ á¨áŤáłá¸áá ááá áŤáľá áĽá áŤááááłáᣠáĽá á°áá áá˝ áááá áááá ááľá°á áá°áŤááš áŤáłáŤáᢠá°áŤáážáš á ááá á ááááŠá á á á ááľá¨á á ááĽáł áá° á¨ááłá áĽáá˛áá°áą ááááŠá á áááť ááš áá áĽáá° HTML áĽááłáŤááá˘
- ááááľ ááľá¨á፠á áááĽáá ááá á¨á°ááá¸á á¨áśáŹáľ á á°ááŁá á áá á á áá áľ á¨á°áŤáŤá ááá˘
á á¨ááłá ááľáĽ áĽá á áááť áá˝ áá áŤá á¨á ááááŽá˝ áááá
áśáŹáśá˝á áá°áá á
á¨áááááľá áááŚá˝ áĽááľ áááááľ á á°áťá áá á áá° Posix UDP Sockets á áἠá¨áá á¤áá á ááá á áĽááááááá˘
áĽáá˛áá á á ááłá¨ áá¨áĄ áá á áŁá ááá ááá á¨áá¨á áááἠá¨áááááá á áľááááá áá á°á áá°áá á áĽááááááá˘
áááłáᣠáĽááá°á ááááá á áŤáľáááááᥠááá á áťáá˝ á¨á°áᨠá¨Firebase áłáłá¤á ááłá áá á á°ááá á°ááłáłá "áááŁá LAN" áá áá¸áá˘
áľááá ᣠáአá¨á áá á áľáŤáťáá˝á á áááááᥠáአá¨Firebase ááá áĽá´áśá˝ (á¨á፠áľáá˝ áá á°ááłáłá) áĽáŠáŽá˝á á áአáááł áááá¨áľ á á áá¸áᣠáĽá áĽáŤááłááą áĽáŠáŤ á á¨á áŤáŁá˘á áá°ááá áááŤáľáááá áĽáŤááłááą ááá âá¨áá¸áľâ IP á áľáŤáťáá˝á áááľáŁáᢠáá ááá á ááá á¨á áá á áľáŤáť áá°áŁ á áľáááááľá áá á áá áŤáľáááłá ᣠáá á ááá áŤááá á°ááŁá ááá˘
á°ááŁáŤá áááľá¨á á¨ááŤáľáááá á ááľá°áá á¤áá á áá¸áááĄ
// 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);
á¤áá á ááá áĽá á¨Posix Sockets API áá á°ááłáłá ááᣠáá áĽááľ á áľááá ááŠááśá˝ á ááľá˘ áááś áĽáŞáá˝á áááááĽáŁ á¨á áŤáŁá˘ á áááá˝á ááá°áĽ áĽá á°áá áááááśá˝.
áááś áĽáŞáá˝á á ááááἠáá
ááá áĽááłá ááá ááŽááŤá á¨ááá¨áááá I/Oá á˘á ááá, áŽáą á áľá á áłá˝ ááľáĽ áĽáá˛á°áŤ áĽáá°áá ááá á á áá áľ.
áá á¨ááá áľ ááááŤáľ á á áłáš ááľáĽ áŤáá á¨ááá áą áá°áľ á¨ááŽááŤá (á፠áľááŞááľ ááá ááĽá á´áá ááá áá˝áá) á°á°áĽááá˘
á á ááŹá á áŤáŁá˘ áĽáá°áá á áááľ áŽáľ ááťá áĽáá˝ááá
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
á¨á áŤáŁá˘ á áá áá°áŁ
á áĽá "áá¨áĽ" ááľáĽ áŤááľ á¨ááľááá ááááľ ááłáááŤáá˝ á¨á á á á áľáŤáťáá˝ á áá°ááᣠáá á¨Firebase áááá˝ áá¸á (áĽááą áá
á á¨áááľá ááĽá¨ááááá˝ áá¸ááĄ- -LmEC50PYZLCiCP-vqde
).
áá ááš áá ááááŤáąá á áááá˝á áááá°áĽ áĽá ááŠááłá¸áá áááá°á˝ (áĽáá˛áá á°áá áá á¨á°áá¨á á áá áĽááąá áááľáááľ) áá´ á áŤáľááááá ᣠáá áĽááá áá á áťáá˝á á ááĽá áĽá´áľ ááá¨áľ áŤáľááááá˘
áá
á áľááá á°ááŁáŽáš áĽá
á áá á¨ááááľ áá. resolve
и reverseResolve
: á áááŹá˝á áĽáá°ááá á¨áááá string áĽá´áľ ááá áá (á á°á áá ááĽááľ ááá á ááá á áááá) ᣠáĽá áááľáŁá á áááááľ áá° IP á áľáŤáť áááá á áá˝ááᢠá¨á°áá¨á á¤áá á áĽáá˛á ááááááľ á¨ááĽá¨ááá ááá
áá
áá áĽá´áľ ááá ááá˘
áá á¨á˛ á¤á á¤áľ ááá áá á°ááłáłá ááᣠááá áá á á°áá áá áá á á áŤáŁá˘á áá¨ááááá˘
áááľá á¨á á á á áľáŤáťáá˝á á á°ááŤáŠ á°áá áá˝ ááŤá¨á áááŤáľ á ááťááᣠáĽá á ááľ á áááľ á ááá áá áá፠áŤáľááá á á°áᨠááááľ ááá á á áá áľá˘
á°áá áááááľ
áŠá˛á áááááľ á ááááá ááá áá áĽááłá¨áá WebRTC á áááľ áĽáŠáŽá˝ ááŤá¨á ááἠááľá°ááá á¨áááአá ááľ á¨á á á¨áááááľ áá°áľ áááááá˘
á°ááłáłá á¨á áĽáľáľáŤáá˝á á°á¨á áá
á¨áĽ á¨ááááᣠ(sendto
/recvfrom
áŤáá
áľá áááááľ á áááá° áĽáŠáŽá˝)ᣠá¨á፠á á¤áá á ááľáĽ âá°ááâ (á¨ááá¨) áááááľ áá¨ááá á ááŁá¸áá˘
áŠá˛áá á˛á áá á âšá ááááŠâş áĽá á âšá°áá ááâş ááŤá¨á á á°ááá°á áááááľ áá áľ á¨áááá áĽá á¨áĽá á¤á°-áá˝áááľ áá ááľá¨á áĽááłáá áľ áá ááá˘
- á¨á áááá áĽáŞáá˝
bind()
á á°á áá°á áá°áĽ áá ááŹáśá˝á ááá á áĽáá°áááá ááľááá° áááá áááá.
áááááľ áááľ áá°áĽ áá° áá¨áá¤á á á áááá ááá áľá áĽáá°á áĽá á áááľ áá ááľáĽ áŤááľá ááľá°áśá˝ áĽááłááŁááá˘
- á¨á áááá áĽáŞáá˝
recvfrom()
á áá áá°áĽ áá á¨ááááá á áľá°ááá á¨ááᥠáĽá˝áá˝á ááá áá˘
á áĽá áááł áá°áá áá°áĽ á¨áááŠáľá á¨ááŹáśá˝ áá¨á áá¨ááἠá ááĽáá˘
áĽáŤááłááą áá°áĽ á¨áŤáą áá¨á á ááᣠáĽá áááŠá áĽá ááľá¨áťáá áá°áŚá˝ á WebRTC áłáłááŤá ááááŞáŤ áá áĽáá¨ááŤáá á á˛áľ ááŹáľ á˛áᣠá¨áľááá áá¨á ááľá°ááá áĽááłááĽá áááá á˘
áĽáŞá á áá¨áá¨áá, áľááá
ááá áĽá˝áá˝ á¨áá á ááá -1 á°ááá°á áĽáááááá errno=EWOULDBLOCK
.
- á°áá áá á¨á ááááŠá á áá áĽá áá°áĽ á á ááłááľ ááŤá ááááśá˝ ááá áá áĽá áá°ááá
sendto()
. áá á°áá á¨ááľáĽ áĽáŞ áŤá°áááá˘bind()
, áľááá á°á¨áłárecvfrom()
áá°áá á ááá áłáŤáľáá˝á ááášá ááá ááá˘
á áĽá áááł, á°áá áá á ááŤá ááááľ á¨ááĽá¨ááá áááá ááá áá áĽá á°ááŁáŠá áá ááá resolve()
á¨á áá á áľáŤáť áááááľ.
á áá ááᣠáááą áĽáŠáŽá˝ áá áĽááľá ááľ áŤáá°ááá á¨WebRTC áá¨áŁá áĽá áĽááááŤááᢠá¨á°ááłáłá á áť áá°áŚá˝ áá áŤá áááááśá˝ á°ááłáłáŠá WebRTC DataChannel áá áááá˘
á á°ááááŞá áĽáá°áŤááᢠbind()
á áááĽáá áá á áááአáĽáá°áá áĽáá˛ááá sendto()
á áá ááááŤáľ á˘ááá˘
á°áá áá ᨠSDP á á ááŚáąá á Firebase ááľáĽ áŁáá á¨á áááá áá°áĽ áá¨á áľá á˛á˝á á áááአá¨á°áá ááá áááááľ áŤáłááá áĽá á áááአá á፠ááá˝ áá°áŁáá˘
á¨áá á áłá˝ áŤáá ááľá ááśáŹáľ áĽá áľ á¨áááĽááľ áá°áľ áĽá á¨ááááŞáŤáá áááĽááľ á¨á°áá áá áá° á áááአáááľá°ááá ááłá áŤáłáŤáá˘
á á°áá áá áĽá á á áááá ááŤá¨á áŤáá á¨áááááľ á°á¨á á¨á°áá ááľá
áá°áá°ááŤ
áá
á áĽáľáŤáá áŤáá áĽáᣠááľá ááłáĄá á á°ááŁá ááá¨áľ áľááá ááááᢠá¨ááłá á áá ááŤááľ áá˝ááá˘
á áŁáá°á¨áŁáá˝ ááŤá¨á á¨ááłá ááľ ááĽááŤ
á¨á ááłá¨ áá¨áĽ á¤á°ááá
ááľ áŽáľ á áá á ááť ááááá˘
ááá: hab.com