ProHoster > Блог > Whakahaerenga > Te kawe i tetahi keemu maha mai i C++ ki te ipurangi me Cheerp, WebRTC me Firebase
Te kawe i tetahi keemu maha mai i C++ ki te ipurangi me Cheerp, WebRTC me Firebase
Whakataki
to tatou kamupene Hangarau Hiringa he otinga mo te kawe i nga tono papamahi tuku iho ki te ipurangi. To tatou C++ compiler tangi hanga he huinga o WebAssembly me JavaScript, e whakarato ana e rua taunekeneke pūtirotiro ngawari, me te mahi teitei.
Hei tauira mo tana tono, i whakatau matou ki te kawe i tetahi keemu maha ki te ipurangi ka kowhiria Teeworlds. Ko Teeworlds he keemu retro 2D maha me te hapori iti engari kaha o nga kaitakaro (tae atu ki ahau!). He iti noa i runga i nga rauemi kua tangohia me nga whakaritenga PTM me te GPU - he kaitono pai.
Rere ana i te Tirotiro Teeworlds
I whakatau matou ki te whakamahi i tenei kaupapa hei whakamatautau rongoā whānui mō te tauranga waehere whatunga ki te tukutuku. I te nuinga o te waa ka mahia tenei i nga huarahi e whai ake nei:
XMLHttpRequest/fetch, mena ko te waahanga whatunga ko nga tono HTTP anake, ranei
Paetukutuku.
Ko nga otinga e rua e hiahia ana ki te manaaki i tetahi waahanga tūmau i te taha o te tūmau, kaore hoki e whakaaetia kia whakamahia hei kawa kawe UDP. He mea nui tenei mo nga tono tuuturu penei i te rorohiko hui ataata me nga keemu, na te mea ka whakamanahia te tuku me te raupapa o nga paatete kawa TCP ka waiho hei arai ki te iti te torohūtanga.
He huarahi tuatoru - whakamahia te whatunga mai i te tirotiro: WebRTC.
RTCDataChannel Ka tautokohia e ia te tuku pono me te kore pono (i te keehi whakamutunga ka ngana ki te whakamahi i te UDP hei kawa kawe i nga wa katoa e taea ana), ka taea te whakamahi me te tūmau mamao me waenga i nga kaitirotiro. Ko te tikanga ka taea e taatau te kawe i te tono katoa ki te tirotiro, tae atu ki te waahanga tūmau!
Heoi, he uaua ano tenei: i mua i te wa e korero ai nga hoa WebRTC e rua, me mahi he ruru-a-ringa tino uaua ki te hono atu, e hiahia ana kia maha nga hinonga-tuatoru (he tūmau tohu me te kotahi, neke atu ranei nga tūmau. STUN/TANGI).
Ko te mea pai, ka hiahia matou ki te hanga i tetahi API whatunga e whakamahi ana i te WebRTC i roto, engari e tata ana ki te atanga UDP Sockets e kore e hiahia ki te whakatu hononga.
Ma tenei ka taea e matou te whakamahi i te WebRTC me te kore e whakaatu i nga korero matatini ki te waehere tono (i hiahia matou ki te whakarereke i nga mea iti i roto i ta maatau kaupapa).
WebRTC iti
Ko te WebRTC he huinga API e waatea ana i roto i nga kaitirotiro e whakarato ana i nga hoa-ki-hoa tuku oro, ataata me nga raraunga koretake.
Ka whakatauhia te hononga i waenga i nga hoa (ahakoa he NAT kei tetahi taha e rua ranei) ma te whakamahi i nga tūmau STUN me/ranei TURN na roto i te tikanga e kiia nei ko ICE. Ka whakawhitihia e nga hoa nga korero ICE me nga tawhā hongere ma te tuku me te whakautu o te kawa SDP.
Aue! E hia nga whakapoto i te wa kotahi? Me whakamarama poto he aha te tikanga o enei kupu:
Wātū Taputapu Takahanga mo te NAT (STUN) — he kawa mo te whakawhiti i te NAT me te whiwhi takirua (IP, tauranga) mo te whakawhiti korero tika me te kaihautu. Mena ka taea e ia te whakaoti i tana mahi, ka taea e nga hoa te whakawhiti korero ki a raatau ano.
Te Whakawhiti Ma te Relay huri noa i te NAT (TANGI) ka whakamahia hoki mo te whakawhiti NAT, engari ka whakatinanahia ma te tuku raraunga ma te takawaenga ka kitea e nga hoa e rua. Ka taapirihia te waatea me te utu nui atu ki te whakatinana i a STUN (na te mea ka whakamahia puta noa i te katoa o nga huihuinga whakawhitiwhiti korero), engari i etahi wa koinei anake te whiringa.
Te Whakaputanga Hononga Pahekoheko (ICE) i whakamahia ki te whiriwhiri i te huarahi tino pai mo te hono atu i nga hoa e rua i runga i nga korero i puta mai i te hono tika i nga hoa, tae atu ki nga korero ka riro mai i etahi o nga tūmau STUN me TURN.
Kawa Whakaahuatanga Wātū (RDS) he whakatakotoranga mo te whakaahua i nga tawhā hongere hononga, hei tauira, nga kaitono ICE, nga kotēkē rongorau (i roto i te take o te hongere oro / ataata), me etahi atu ... Ka tukuna e tetahi o nga hoa he Whakaaetanga SDP, ka whakautu te tuarua me te Whakautu SDP . I muri i tenei, ka hangaia he hongere.
Hei hanga hononga pera, me kohia e nga hoa nga korero ka whiwhi mai i nga kaitoro STUN me TURN me te whakawhiti ki a raatau ano.
Ko te raru ko te mea kare ano ratou i te kaha ki te whakawhiti korero tika, na reira me noho he tikanga ki waho o te roopu hei whakawhiti i enei raraunga: he tūmau tohu.
He tino ngawari te tūmau tohu na te mea ko tana mahi anake ko te tuku raraunga i waenga i nga hoa i roto i te wahanga ruru-a-ringa (e whakaatu ana i te hoahoa i raro nei).
Hoahoa raupapa ruru ringa a WebRTC ngawari
Teeworlds Network Model Overview
He tino ngawari te hoahoanga whatunga Teeworlds:
Ko nga waahanga kiritaki me te tūmau he kaupapa rereke e rua.
Ka uru atu nga kaihoko ki te keemu ma te hono atu ki tetahi o nga kaitoro maha, ka whakahaerehia e ia he keemu kotahi anake i ia wa.
Ko nga whakawhitinga raraunga katoa i roto i te keemu ka mahia ma te tūmau.
Ka whakamahia he tūmau matua motuhake hei kohi rārangi o ngā tūmau tūmatanui katoa e whakaatuhia ana ki te kiritaki kēmu.
Ma te whakamahi i te WebRTC mo te whakawhiti raraunga, ka taea e taatau te whakawhiti i te waahanga tūmau o te keemu ki te tirotiro kei reira te kaihoko. He whai waahi nui tenei ki a tatou ...
Peia atu nga tūmau
He painga pai te kore o te arorau o te tūmau: ka taea e tatou te tuku i te tono katoa hei ihirangi pateko i runga i nga wharangi Github, i runga ranei i a maatau ake taputapu kei muri Cloudflare, na reira ka whakarite kia tere te tango me te wa roa mo te kore utu. Inaa, ka wareware tatou ki a raatau, a mena ka waimarie tatou ka rongonuihia te keemu, karekau e tika kia whakahoutia nga hanganga.
Heoi, kia mahi te punaha, me whakamahi tonu tatou i tetahi hoahoanga o waho:
Kotahi, neke atu ranei nga tūmau STUN: He maha nga whiringa koreutu hei whiriwhiri mai.
Kia kotahi te tūmau TURN: karekau he whiringa kore utu i konei, na ka taea e taatau te whakarite i a maatau ake, te utu ranei mo te ratonga. Waimarie, ko te nuinga o nga wa ka taea te whakatuu hononga ma roto i nga kaitoro STUN (me te whakarato p2p pono), engari ka hiahiatia a TURN hei whiringa takahuri.
Tūmau Waitohu: Kaore i rite ki era atu waahanga e rua, kaore i te whakatauhia te tohu. He aha te kawenga a te tūmau tohu i runga i te tono. I to maatau, i mua i te whakatuu hononga, he mea tika ki te whakawhiti i te iti o nga raraunga.
Teeworlds Master Server: Ka whakamahia e etahi atu tūmau ki te panui i to ratau oranga me nga kaihoko ki te rapu i nga kaitoro a te iwi. Ahakoa kaore e hiahiatia ana (ka taea e nga kaihoko te hono atu ki tetahi tūmau e mohio ana a-ringa), he pai ki te whai kia uru atu nga kaitakaro ki nga keemu me nga tangata ohorere.
I whakatau matou ki te whakamahi i nga tūmau STUN kore utu a Google, ka tukuna e matou tetahi tūmau TURN.
Mo nga tohu whakamutunga e rua i whakamahia e matou Firebase:
He tino ngawari te whakatinanatanga o te tūmau matua o Teeworlds: hei rarangi taonga kei roto nga korero (ingoa, IP, mapi, aratau, ...) o ia tūmau hohe. Ka whakaputahia, ka whakahouhia e nga Kaitono a raatau ake mea, ka tangohia e nga kaihoko te rarangi katoa ka whakaatu ki te kaitakaro. Ka whakaatuhia ano e matou te rarangi i runga i te wharangi kaainga hei HTML kia taea e nga kaitakaro te paato noa i te tūmau ka haria tika atu ki te keemu.
Ko te tohu tohu e hono tata ana ki a maatau turanga turanga, e whakaahuatia ana i te waahanga e whai ake nei.
Rarangi o nga kaitoro i roto i te keemu me te wharangi kaainga
Te whakatinanatanga o nga turanga
Kei te pirangi matou ki te hanga API e tata ana ki te Posix UDP Sockets hei whakaiti i te maha o nga huringa e hiahiatia ana.
Kei te hiahia hoki matou ki te whakatinana i te iti rawa e hiahiatia ana mo te whakawhiti raraunga ngawari ake i runga i te whatunga.
Hei tauira, kaore e hiahiatia he ararere tuturu: ko nga hoa katoa kei runga i te "LAN mariko" kotahi e hono ana ki tetahi tauira patengi raraunga Firebase.
No reira, kaore matou e hiahia ki nga wahitau IP ahurei: ko nga uara matua Firebase ahurei (he rite ki nga ingoa rohe) e ranea ana ki te tautuhi i nga hoa, a ka tukuna e ia hoa o te rohe nga wahitau IP "rūpahu" ki ia matua me whakamaori. Ka whakakorea katoatia e tenei te hiahia mo te taumahi wahitau IP o te ao, he mahi kore-iti.
Anei te iti rawa o te API hei whakatinana:
// 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);
He ngawari te API me te rite ki te Posix Sockets API, engari he iti noa nga rereketanga: te takiuru hokinga waea, te tautapa i nga IP rohe, me nga hononga mangere.
Te Rehita Waea Whakahoki
Ahakoa ka whakamahia e te kaupapa taketake te I/O kore-aukati, me whakahoki ano te waehere kia rere i roto i te tirotiro tukutuku.
Ko te take o tenei ko te takahanga takahanga i roto i te kaitirotiro kua huna mai i te kaupapa (he JavaScript, WebAssembly ranei).
I roto i te taiao taketake ka taea e tatou te tuhi waehere penei
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;
...
}
...
}
Mena kua huna te takahanga ki a tatou, katahi ka huri kia penei:
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
Taumahi IP rohe
Ko nga TT node i roto i to tatou "whatunga" ehara i te wahitau IP, engari ko nga taviri Firebase (he aho penei te ahua: -LmEC50PYZLCiCP-vqde ).
He watea tenei na te mea kaore e hiahiatia he tikanga mo te tautapa i nga IP me te tirotiro i o raatau ahurei (me te whakakore i muri i te momotu a te kiritaki), engari he mea tika kia tautuhia nga hoa ma te uara tau.
Koinei te mea e whakamahia ana nga mahi. resolve и reverseResolve: Ka whiwhi te tono i te uara aho o te taviri (ma te whakauru kaiwhakamahi, ma te tūmau matua ranei), ka taea te huri ki tetahi wahitau IP mo te whakamahi o roto. Ko te toenga o te API ka whiwhi i tenei uara hei utu mo te aho mo te ngawari.
He rite tenei ki te tirotiro DNS, engari ka mahia i te rohe ki runga i te kiritaki.
Arā, kaore e taea te tiri i nga wahitau IP ki waenga i nga kaihoko rereke, a, ki te hiahiatia etahi momo tohu tohu o te ao, me hanga he huarahi rereke.
Hononga mangere
Kaore e hiahiatia he hononga a UDP, engari kua kitehia e matou, me roa te tukanga hononga hono a WebRTC i mua i tana tiimata ki te whakawhiti raraunga i waenga i nga hoa tokorua.
Mena kei te pirangi matou ki te whakarato i taua taumata tangohanga, (sendto/recvfrom me nga hoa noho noa kaore he hononga i mua), katahi me mahi he hononga "mangere" (kua roa) i roto i te API.
Koinei te mea ka tupu i te wa o te whakawhitiwhiti korero i waenga i te "tumau" me te "kiritaki" i te wa e whakamahi ana i te UDP, me nga mahi a to maatau whare pukapuka:
Nga waea a te tūmau bind()ki te korero ki te punaha whakahaere kei te pirangi ia ki te whiwhi paakete i runga i te tauranga kua tohua.
Engari, ka whakaputahia e matou he tauranga tuwhera ki Firebase i raro i te taviri tūmau me te whakarongo mo nga huihuinga i roto i tana subtree.
Nga waea a te tūmau recvfrom(), e whakaae ana ki nga paatete ka puta mai i tetahi kaihautu i runga i tenei tauranga.
I roto i to maatau, me tirotirohia te rarangi taumai o nga paatete ka tukuna ki tenei tauranga.
Kei ia tauranga tana ake rarangi, a ka taapirihia e matou te puna me nga tauranga taunga ki te timatanga o nga tohu raraunga WebRTC kia mohio ai matou ko tehea rarangi ka tukuna atu ina tae mai he kete hou.
Ko te waea kaore i te aukati, na mena karekau he putea, ka hoki noa mai -1 ka whakatauhia errno=EWOULDBLOCK.
Ka whiwhi te kiritaki i te IP me te tauranga o te tūmau na etahi tikanga o waho, me te waea sendto(). Ka karanga ano tenei i roto. bind(), no reira i muri mai recvfrom() ka whiwhi i te whakautu me te kore e tino mahia te here.
I roto i to maatau, ka whakawhiwhia e te kiritaki ki waho te taviri aho me te whakamahi i te mahi resolve() ki te whiwhi wāhitau IP.
I tenei wa, ka timatahia e matou he ruuruu WebRTC mena kaore ano nga hoa e rua e hono ana ki a raatau. Ko nga hononga ki nga tauranga rereke o te hoa kotahi e whakamahi ana i te WebRTC DataChannel.
Ka mahi autaki ano matou bind()kia taea ai e te tūmau te hono anō i te wā e whai ake nei sendto() kei katia mo etahi take.
Ka whakamohiotia te tūmau mo te hononga o te kiritaki ina tuhia e te kiritaki tana tuku SDP i raro i nga korero tauranga tūmau i Firebase, ka whakautu te tūmau me tana whakautu ki reira.
Ko te hoahoa i raro nei e whakaatu ana i tetahi tauira o te rere karere mo te kaupapa turanga me te tuku i te karere tuatahi mai i te kiritaki ki te tūmau:
Whakaotia te hoahoa o te wahanga hononga i waenga i te kiritaki me te tūmau
mutunga
Mena kua panui koe i tenei tawhiti, kei te pirangi koe ki te kite i te kaupapa e mahi ana. Ka taea te takaro i te keemu teeworlds.leaningtech.com, whakamatauria!
Whakahoahoa i waenga i nga hoa mahi
Kei te waatea noa te waehere whare pukapuka whatunga ki GitHub. Hono mai ki te korerorero i runga i ta maatau hongere i Tino!