Kutakura mutambo wevazhinji kubva kuC++ kuenda pawebhu neCheerp, WebRTC uye Firebase

Nhanganyaya

kambani yedu Leaning Technologies inopa mhinduro dzekutumira echinyakare desktop desktop kuwebhu. Yedu C++ compiler cheerp inogadzira musanganiswa weWebAssembly uye JavaScript, iyo inopa ese ari maviri nyore browser kudyidzana, uye kushanda kwepamusoro.

Semuenzaniso wekushandiswa kwayo, takasarudza kuendesa mutambo wevazhinji kuwebhu uye takasarudza Teeworlds. Teeworlds mutambo wevazhinji XNUMXD retro ine nharaunda diki asi inoshanda yevatambi (kusanganisira ini!). Idiki zvese maererano nezviwanikwa zvakadhawunirwa uye CPU neGPU zvinodiwa - mumiriri akakodzera.

Kutakura mutambo wevazhinji kubva kuC++ kuenda pawebhu neCheerp, WebRTC uye Firebase
Kumhanya muTeeworlds browser

Takasarudza kushandisa chirongwa ichi kuedza nacho general mhinduro dzekutumira network kodhi kuwebhu. Izvi zvinowanzoitwa nenzira dzinotevera:

  • XMLHttpRequest/fetch, kana chikamu chetiweki chinosanganisira chete zvikumbiro zveHTTP, kana
  • WebSockets.

Mhinduro dzese dziri mbiri dzinoda kubata sevha chikamu padivi reseva, uye haibvumire kushandiswa seprotocol yekufambisa UDP. Izvi zvakakosha kune chaiyo-nguva zvikumbiro senge vhidhiyo conferencing software nemitambo, nekuti inovimbisa kuendesa uye kurongeka kweprotocol mapaketi. TCP inogona kuva chipingamupinyi kune low latency.

Pane nzira yechitatu - shandisa network kubva kubrowser: WebRTC.

RTCDataChannel Inotsigira zvose zvakavimbika uye zvisingavimbiki kutapurirana (mune iyo yekupedzisira inoedza kushandisa UDP seprotocol yekufambisa pose pazvinobvira), uye inogona kushandiswa zvose nevhavha iri kure uye pakati pemabhurawuza. Izvi zvinoreva kuti isu tinogona kuendesa iyo yese application kubrowser, kusanganisira sevha chikamu!

Nekudaro, izvi zvinouya nekuwedzera kuoma: pamberi pevaviri veWebRTC vezera ravo vanokwanisa kutaurirana, vanofanirwa kuita kubata maoko kwakaoma kuti vabatanidze, izvo zvinoda akati wandei-bato masangano (sevha yekusaina uye imwe kana akawanda maseva. STUN/Tendeuka).

Zvakanaka, tinoda kugadzira network API inoshandisa WebRTC mukati, asi iri padyo sezvinobvira kune UDP Sockets interface iyo isingade kumisa chinongedzo.

Izvi zvinotitendera kutora mukana weWebRTC pasina kuburitsa pachena zvinhu zvakaomarara kune kodhi yekushandisa (iyo yataida kushandura zvishoma sezvazvinogona mupurojekiti yedu).

Minimum WebRTC

WebRTC seti yemaAPI anowanikwa mumabhurawuza anopa peer-kune-vezera kutapurirana kweodhiyo, vhidhiyo uye zvisina tsarukano data.

Kubatana pakati pevezera kunotangwa (kunyangwe paine NAT kune rimwe kana mativi ese) uchishandisa STUN uye/kana TURN maseva kuburikidza nemuchina unonzi ICE. Vezera vanotsinhana ICE ruzivo uye chiteshi paramita kuburikidza nekupa uye mhinduro yeSDP protocol.

Wow! Mapfupi mangani panguva imwe chete? Ngatitsanangurei muchidimbu kuti mazwi aya anorevei:

  • Session Traversal Utilities yeNAT (STUN) - protocol yekunzvenga NAT uye kutora peya (IP, chiteshi) yekuchinjana data zvakananga nemugamuchiri. Kana akakwanisa kupedza basa rake, saka vezera vanogona kuzvimiririra kuchinjana data nemumwe.
  • Kutenderera Kushandisa Relays kutenderedza NAT (Tendeuka) inoshandiswawo kuNAT traversal, asi inoshandisa izvi nekutumira data kuburikidza neproxy inoonekwa kune vese vezera. Inowedzera latency uye inodhura kuita kupfuura STUN (nekuti inoshandiswa mukati mechikamu chese chekutaurirana), asi dzimwe nguva ndiyo yega sarudzo.
  • Interactive Connectivity Establishment (chando) yakashandiswa kusarudza nzira yakanakisisa yekubatanidza vezera vaviri zvichienderana nemashoko akawanikwa kubva pakubatanidza vezera zvakananga, uyewo ruzivo rwakagamuchirwa nenhamba ipi zvayo yeSTUN uye TURN maseva.
  • Chikamu Tsanangudzo Protocol (RDS) imhando yekutsanangura nzira dzekubatanidza chiteshi, semuenzaniso, vakwikwidzi veICE, macodecs emultimedia (munyaya yechiteshi chekuteerera / vhidhiyo), nezvimwe ... Mumwe wevezera anotumira SDP Offer, uye wechipiri anopindura neSDP Mhinduro. . Mushure meizvi, chiteshi chinogadzirwa.

Kuti ugadzire kubatana kwakadaro, vezera vanofanirwa kuunganidza ruzivo rwavanogamuchira kubva kune STUN uye TURN maseva uye vochinjana pamwe chete.

Dambudziko nderekuti havasati vakwanisa kutaurirana zvakananga, saka nzira yekunze-ye-bhendi inofanirwa kuvepo yekutsinhanisa iyi data: sevha yekusaina.

Sevha yekusaina inogona kuve yakapusa nekuti basa rayo chete ndere kutumira data pakati pevezera muchikamu chekubata maoko (sezvinoratidzwa mumufananidzo uri pazasi).

Kutakura mutambo wevazhinji kubva kuC++ kuenda pawebhu neCheerp, WebRTC uye Firebase
Yakarerutswa WebRTC handshake sequence diagram

Teeworlds Network Model Overview

Teeworlds network architecture iri nyore kwazvo:

  • Mutengi uye sevha zvikamu zvirongwa zviviri zvakasiyana.
  • Vatengi vanopinda mumutambo nekubatanidza kune imwe yemaseva akati wandei, imwe neimwe inobata mutambo mumwe chete panguva.
  • Yese kuendesa data mumutambo kunoitwa kuburikidza neseva.
  • Yakakosha master server inoshandiswa kuunganidza runyorwa rwese maseva ese eruzhinji anoratidzwa mune yemutambo mutengi.

Nekuda kwekushandiswa kweWebRTC yekuchinjana data, tinogona kuendesa sevha chikamu chemutambo kune browser uko mutengi aripo. Izvi zvinotipa mukana wakakura...

Bvisa maseva

Iko kushomeka kwesevha logic kune yakanaka mukana: isu tinokwanisa kuendesa iyo yese application seyakamira yezvinhu paGithub Mapeji kana pane yedu hardware kuseri kweCloudflare, nekudaro kuve nechokwadi chekurodha nekukurumidza uye yakakwira uptime yemahara. Muchokwadi, isu tinogona kukanganwa nezvavo, uye kana isu tine rombo rakanaka uye mutambo ukava mukurumbira, saka zvivakwa hazvifanirwe kuve zvechizvino-zvino.

Nekudaro, kuti sisitimu ishande, isu tichiri kufanira kushandisa yekunze dhizaini:

  • Imwe kana anopfuura STUN maseva: Tine akati wandei emahara sarudzo dzekusarudza kubva.
  • Inenge imwe TURN sevha: hapana sarudzo dzemahara pano, saka tinogona kumisikidza zvedu kana kubhadhara sevhisi. Neraki, yakawanda yenguva iyo yekubatanidza inogona kusimbiswa kuburikidza neSTUN maseva (uye kupa yechokwadi p2p), asi TURN inodiwa senge yekudzokera kumashure.
  • Signaling Server: Kusiyana nemamwe maviri maficha, kusaina hakuna kumira. Izvo izvo sevha yekusaina ichanyatso kuve nebasa nazvo zvinoenderana neimwe nzira pane application. Muchiitiko chedu, tisati tatanga kuwirirana, zvakakosha kuchinjana zvishoma data.
  • Teeworlds Master Server: Inoshandiswa nemamwe maseva kushambadzira kuvapo kwavo uye nevatengi kutsvaga maseva eruzhinji. Kunyange zvisingadiwe (vatengi vanogona kugara vachibatana nesevha yavanoziva nezvayo), zvingave zvakanaka kuve nazvo kuitira kuti vatambi vatore chikamu mumitambo nevanhu vasina kujairika.

Tafunga kushandisa maseva eGoogle emahara STUN, uye takaisa imwe TURN server isu pachedu.

Pamapoinzi maviri ekupedzisira atakashandisa Firebase:

  • Iyo Teeworlds master server inoitiswa zvakapusa: senge runyorwa rwezvinhu zvine ruzivo (zita, IP, mepu, modhi, ...) yega yega inoshanda sevha. Masevha anoshambadza uye anovandudza chinhu chavo, uye vatengi vanotora runyorwa rwese voratidza kumutambi. Isu tinoratidzawo rondedzero iri papeji yekumba seHTML kuitira kuti vatambi vangodzvanya pane sevha votorwa vakananga kumutambo.
  • Chiratidzo chine hukama zvakanyanya nekuita kwedu zvigadziko, zvinotsanangurwa muchikamu chinotevera.

Kutakura mutambo wevazhinji kubva kuC++ kuenda pawebhu neCheerp, WebRTC uye Firebase
Rondedzero yemaseva mukati memutambo uye pane peji repamba

Kuitwa kwezvigadziko

Tinoda kugadzira API iri padyo nePosix UDP Sockets sezvinobvira kudzikisa huwandu hwekuchinja kunodiwa.

Isu tinoda zvakare kuita hudiki hunodiwa hunodiwa kune yakapusa data kuchinjanisa pamusoro petiweki.

Semuenzaniso, isu hatidi chaiyo nzira: vese vezera vari pa "chaiyo LAN" yakafanana ine chekuita neiyo chaiyo Firebase dhatabhesi muenzaniso.

Naizvozvo, isu hatidi akasarudzika IP kero: yakasarudzika Firebase makiyi makiyi (akafanana nemazita emadomasi) anokwana kuziva zvakasarudzika vezera, uye mumwe nemumwe wezera munharaunda anopa "ekunyepedzera" IP kero kune yega yega kiyi inoda kududzirwa. Izvi zvinobvisa zvachose kudiwa kwepasi rose IP kero assignment, iro risiri basa diki.

Heino shoma API yatinofanira kuita:

// 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);

Iyo API iri nyore uye yakafanana nePosix Sockets API, asi ine mashoma akakosha mutsauko: kutema macallbacks, kugovera maIPs emunharaunda, uye simbe yekubatanidza.

Kunyoresa Macallbacks

Kunyangwe kana chirongwa chepakutanga chichishandisa kusavharira I/O, iyo kodhi inofanirwa kudzokororwa kuti ishande muwebhu browser.

Chikonzero cheizvi ndechekuti chiitiko loop mubrowser yakavanzwa kubva kuchirongwa (ngave JavaScript kana WebAssembly).

Munzvimbo yekuzvarwa tinogona kunyora kodhi seizvi

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;
    ...
  }
  ...
}

Kana iyo loop yechiitiko yakavanzwa kwatiri, saka isu tinofanirwa kuishandura kuita chinhu chakadai:

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

Local IP assignment

Iwo maID ID mu "network" yedu haasi IP kero, asi Firebase makiyi (ndiwo tambo dzinotaridzika seizvi: -LmEC50PYZLCiCP-vqde ).

Izvi zvakaringana nekuti isu hatidi michina yekugovera maIP uye kutarisa kusarudzika kwavo (pamwe nekuabvisa mushure mekunge mutengi abvisa), asi kazhinji zvinodikanwa kuziva vezera nenhamba kukosha.

Izvi ndizvo chaizvo izvo mabasa anoshandiswa. resolve ΠΈ reverseResolve: Chishandiso neimwe nzira chinogashira kukosha kwetambo yekiyi (kuburikidza nemushandisi kupinza kana kuburikidza neye master server), uye inogona kuishandura kuita IP kero yekushandisa mukati. Iyo yese yeAPI inogamuchirawo kukosha uku pachinzvimbo chetambo yekureruka.

Izvi zvakafanana neDNS yekutarisa, asi inoitwa munharaunda pane mutengi.

Ndokunge, IP kero haigone kugovaniswa pakati pevatengi vakasiyana, uye kana imwe mhando yepasirese chiziviso ichidikanwa, ichafanirwa kugadzirwa neimwe nzira.

Simbe kubatana

UDP haidi chinongedzo, asi sezvataona, WebRTC inoda nzira yakareba yekubatanidza isati yatanga kutumira data pakati pevezera vaviri.

Kana isu tichida kupa iyo yakafanana nhanho yekubvisa, (sendto/recvfrom nevezera rinopokana vasina kubatana kwekutanga), saka vanofanirwa kuita "usimbe" (kunonoka) kubatana mukati meAPI.

Izvi ndizvo zvinoitika panguva yekukurukurirana kwakajairwa pakati pe "server" uye "mutengi" kana uchishandisa UDP, uye izvo raibhurari yedu inofanira kuita:

  • Sevha inofona bind()kuudza iyo inoshanda sisitimu kuti inoda kugashira mapaketi pachiteshi chakatsanangurwa.

Pane kudaro, isu tichashambadza chiteshi chakavhurika kuFirebase pasi pesevha kiyi uye titeerere zviitiko mu subtree yayo.

  • Sevha inofona recvfrom(), kugamuchira mapaketi anouya kubva kune chero muenzi pachiteshi ichi.

Muchiitiko chedu, tinoda kutarisa mutsara unouya wemapaketi anotumirwa kuchiteshi ichi.

Chiteshi chega chega chine mutsara waro, uye isu tinowedzera kunobva uye kwekuenda zviteshi pakutanga kweWebRTC datagrams kuitira kuti tizive kuti ndeupi mutsara wekuendesa mberi kana pakiti nyowani yasvika.

Kufona hakusi kuvharisa, saka kana pasina mapaketi, tinongodzoka -1 toseta errno=EWOULDBLOCK.

  • Mutengi anogamuchira IP uye chiteshi cheseva neimwe nzira dzekunze, uye mafoni sendto(). Izvi zvinoitawo kufona kwemukati. bind(), saka zvinotevera recvfrom() anogashira mhinduro pasina kuburitsa bhandi.

Muchiitiko chedu, mutengi kunze anogamuchira kiyi yetambo uye anoshandisa basa resolve() kuti uwane IP kero.

Panguva ino, isu tinotanga kukwazisana kweWebRTC kana vaviri vezera vasati vabatana kune mumwe nemumwe. Kubatanidza kune akasiyana madoko evezera rimwe chete anoshandisa imwechete WebRTC DataChannel.

Isu tinoitawo zvisina kunanga bind()kuitira kuti sevha igone kubatana zvakare mune inotevera sendto() kana yakavhara nekuda kwechimwe chikonzero.

Sevha inoziviswa nezvekubatana kwemutengi kana mutengi achinyora SDP yayo pasi peiyo server port ruzivo muFirebase, uye sevha inopindura nemhinduro yayo ipapo.

Dhiagiramu iri pazasi inoratidza muenzaniso wekuyerera kwemeseji kune socket scheme uye kuendesa meseji yekutanga kubva kumutengi kuenda kune server:

Kutakura mutambo wevazhinji kubva kuC++ kuenda pawebhu neCheerp, WebRTC uye Firebase
Yakazara dhayagiramu yechikamu chekubatanidza pakati pemutengi neseva

mhedziso

Kana iwe wakaverenga kusvika apa, iwe unogona kunge uchifarira kuona dzidziso ichiitwa. Mutambo unogona kutambwa teeworlds.leaningtech.com, zviedze!


Hushamwari mutambo pakati pevaanoshanda navo

Iyo network raibhurari kodhi inowanikwa mahara pa Github. Joinha nhaurirano pachiteshi chedu pa Gitter!

Source: www.habr.com

Voeg