Ihambisa umdlalo wabadlali abaningi ukusuka ku-C++ ukuya kuwebhu nge-Cheerp, WebRTC kanye ne-Firebase

Isingeniso

inkampani yethu I-Leaning Technologies inikeza izixazululo zokuthutha izinhlelo zokusebenza zedeskithophu ezivamile kuwebhu. Umdidiyeli wethu we-C++ thokoza ikhiqiza inhlanganisela ye-WebAssembly ne-JavaScript, ehlinzeka ngazo zombili ukuxhumana kwesiphequluli okulula, nokusebenza okuphezulu.

Njengesibonelo sokusetshenziswa kwayo, sinqume ukufaka igeyimu yabadlali abaningi kuwebhu futhi sakhetha Teeworlds. I-Teeworlds iwumdlalo we-retro wabadlali abaningi we-2D onomphakathi omncane kodwa osebenzayo wabadlali (okuhlanganisa nami!). Incane kokubili ngokwezinsiza ezilandiwe kanye nezidingo ze-CPU ne-GPU - ikhandidethi elifanele.

Ihambisa umdlalo wabadlali abaningi ukusuka ku-C++ ukuya kuwebhu nge-Cheerp, WebRTC kanye ne-Firebase
Isebenza kusiphequluli se-Teeworlds

Sinqume ukusebenzisa le phrojekthi ukuhlola izixazululo ezijwayelekile zokuhambisa ikhodi yenethiwekhi kuwebhu. Lokhu ngokuvamile kwenziwa ngezindlela ezilandelayo:

  • XMLHttpRequest/landa, uma ingxenye yenethiwekhi iqukethe kuphela izicelo ze-HTTP, noma
  • AmaWebSocket.

Zombili izixazululo zidinga ukusingathwa kwengxenye yeseva ohlangothini lweseva, futhi azivumeli ukusetshenziswa njengephrothokholi yezokuthutha UDP. Lokhu kubalulekile ezinhlelweni zesikhathi sangempela ezifana nesofthiwe yenkomfa ngevidiyo nemidlalo, ngoba iqinisekisa ukulethwa nokuhleleka kwamaphakethe ephrothokholi. I-TCP kungase kube yisithiyo ekubambezelekeni okuphansi.

Kukhona indlela yesithathu - sebenzisa inethiwekhi kusuka kusiphequluli: I-WebRTC.

I-RTCDataChannel Isekela kokubili ukudluliselwa okuthembekile nokungathembeki (esimweni sakamuva izama ukusebenzisa i-UDP njengephrothokholi yezokuthutha noma nini lapho kunokwenzeka), futhi ingasetshenziswa kokubili ngeseva ekude naphakathi kweziphequluli. Lokhu kusho ukuthi singakwazi ukuthutha lonke uhlelo lokusebenza esipheqululini, kuhlanganise nengxenye yeseva!

Kodwa-ke, lokhu kuza nobunzima obengeziwe: ngaphambi kokuthi ontanga ababili be-WebRTC bakwazi ukuxhumana, badinga ukuxhawula izandla okuyinkimbinkimbi ukuze baxhume, okudinga izinhlangano ezimbalwa zezinkampani zangaphandle (iseva yokusayina kanye neseva eyodwa noma ngaphezulu. STUN/VULA).

Ngokufanelekile, singathanda ukudala i-API yenethiwekhi esebenzisa i-WebRTC ngaphakathi, kodwa eseduze kakhulu nesixhumi esibonakalayo se-UDP Sockets engadingi ukusungula uxhumano.

Lokhu kuzosivumela ukuthi sisebenzise i-WebRTC ngaphandle kokudalula imininingwane eyinkimbinkimbi kukhodi yesicelo (ebesifuna ukuyishintsha kancane ngangokunokwenzeka kuphrojekthi yethu).

I-WebRTC encane

I-WebRTC isethi yama-API atholakala kuziphequluli ezihlinzeka ngokudluliswa kontanga kuya kontanga komsindo, ividiyo kanye nedatha engafanele.

Ukuxhumana phakathi kontanga kuyasungulwa (ngisho noma kukhona i-NAT ohlangothini olulodwa noma zombili) kusetshenziswa amaseva we-STUN kanye/noma we-TURN ngendlela ebizwa ngokuthi i-ICE. Ontanga bashintshisana ngolwazi lwe-ICE namapharamitha esiteshi ngokunikezwayo nangempendulo yephrothokholi ye-SDP.

Hewu! Zingaki izifinyezo ngesikhathi esisodwa? Ake sichaze kafushane ukuthi la magama asho ukuthini:

  • Izinsiza Zokunqamula Kweseshini ze-NAT (STUN) β€” umthetho olandelwayo wokweqa i-NAT nokuthola ipheya (IP, imbobo) yokushintshisana ngedatha ngokuqondile nomsingathi. Uma ekwazi ukuqedela umsebenzi wakhe, khona-ke ontanga bangakwazi ukushintshanisa idatha ngokuzimela.
  • I-Traversal Ukusebenzisa ama-Relays azungeze i-NAT (VULA) iphinde isetshenziselwe ukuvundla kwe-NAT, kodwa isebenzisa lokhu ngokudlulisa idatha ngommeleli obonakalayo kubo bobabili ontanga. Yengeza ukubambezeleka futhi kubiza kakhulu ukukusebenzisa kune-STUN (ngoba isetshenziswa kuso sonke isikhathi sokuxhumana), kodwa ngezinye izikhathi iyona kuphela inketho.
  • Ukusungulwa kokuxhumana okusebenzisanayo (ICE) esetshenziselwa ukukhetha indlela engcono kakhulu yokuxhuma ontanga ababili ngokusekelwe olwazini olutholwe ekuxhumaniseni ontanga ngokuqondile, kanye nolwazi olutholwe inoma iyiphi inombolo yamaseva e-STUN ne-TURN.
  • Iphrothokholi Yencazelo Yeseshini (I-SDP) ifomethi yokuchaza amapharamitha wesiteshi soxhumano, isibonelo, amakhandidethi e-ICE, amakhodekhi emultimedia (uma kuyisiteshi somsindo/ividiyo), njll... Omunye untanga uthumela Umnikelo we-SDP, futhi owesibili uphendula ngempendulo ye-SDP. . . Ngemva kwalokhu, isiteshi siyakhiwa.

Ukuze udale uxhumo olunjalo, ontanga badinga ukuqoqa ulwazi abaluthola kumaseva e-STUN ne-TURN futhi bashintshisane ngalo.

Inkinga ukuthi okwamanje abakabi nalo ikhono lokuxhumana ngokuqondile, ngakho-ke indlela engaphandle kwebhendi kufanele ibe khona ukushintshanisa le datha: iseva yokusayina.

Iseva yokusayina ingaba lula kakhulu ngoba umsebenzi wayo kuphela ukudlulisa idatha phakathi kontanga esigabeni sokuxhawula (njengoba kukhonjisiwe kumdwebo ongezansi).

Ihambisa umdlalo wabadlali abaningi ukusuka ku-C++ ukuya kuwebhu nge-Cheerp, WebRTC kanye ne-Firebase
Umdwebo owenziwe lula we-WebRTC wokuxhawula isandla

Ukubuka konke kwemodeli ye-Teeworlds Network

I-Teeworlds network architecture ilula kakhulu:

  • Iklayenti nezingxenye zeseva ziyizinhlelo ezimbili ezihlukene.
  • Amaklayenti angena emdlalweni ngokuxhuma kwenye yeziphakeli ezimbalwa, ngayinye esingethe umdlalo owodwa ngesikhathi.
  • Konke ukudluliswa kwedatha kugeyimu kwenziwa ngeseva.
  • Iseva eyisipesheli eyinhloko isetshenziselwa ukuqoqa uhlu lwawo wonke amaseva omphakathi aboniswa kuklayenti lomdlalo.

Ngenxa yokusebenzisa i-WebRTC ukushintshanisa idatha, singadlulisela ingxenye yeseva yomdlalo esipheqululini lapho iklayenti likhona. Lokhu kusinika ithuba elihle...

Lahla amaseva

Ukuntuleka komqondo weseva kunenzuzo enhle: singasebenzisa lonke uhlelo lokusebenza njengokuqukethwe okumile Emakhasini e-Github noma ku-hardware yethu ngemuva kwe-Cloudflare, ngaleyo ndlela siqinisekise ukulandwa okusheshayo kanye nesikhathi esiphezulu samahhala. Eqinisweni, singakhohlwa ngabo, futhi uma sinenhlanhla futhi umdlalo uthandwa, khona-ke ingqalasizinda ngeke kudingeke yenziwe ibe yesimanje.

Nokho, ukuze uhlelo lusebenze, kusafanele sisebenzise i-architecture yangaphandle:

  • Iseva eyodwa noma amaningi e-STUN: Sinezinketho ezimbalwa zamahhala esingakhetha kuzo.
  • Okungenani iseva ye-TURN eyodwa: azikho izinketho zamahhala lapha, ngakho-ke singakwazi ukumisa ezethu noma ukukhokhela insizakalo. Ngenhlanhla, isikhathi esiningi ukuxhumana kungasungulwa ngamaseva e-STUN (futhi kunikeze i-p2p yangempela), kodwa i-TURN iyadingeka njengenketho yokubuyela emuva.
  • Iseva Yokusayina: Ngokungafani nezinye izici ezimbili, ukusayina akulinganisiwe. Ukuthi iseva esayinayo izoba nesibopho ngani kuncike kancane kuhlelo lokusebenza. Esimweni sethu, ngaphambi kokusungula uxhumano, kuyadingeka ukushintshanisa inani elincane ledatha.
  • I-Teeworlds Master Server: Isetshenziswa ngamanye amaseva ukukhangisa ubukhona bawo kanye namakhasimende ukuthola amaseva omphakathi. Nakuba kungadingeki (amaklayenti angahlala exhumeka kuseva ayazi ngayo mathupha), kungaba kuhle ukuba khona ukuze abadlali bakwazi ukuhlanganyela kumageyimu nabantu abangahleliwe.

Sinqume ukusebenzisa amaseva e-STUN amahhala e-Google, futhi sazifakela iseva eyodwa ye-TURN.

Ngamaphuzu amabili okugcina siwasebenzisile I-Firebase:

  • Iseva eyinhloko ye-Teeworlds isetshenziswa kalula nje: njengohlu lwezinto eziqukethe ulwazi (igama, i-IP, imephu, imodi, ...) yeseva ngayinye esebenzayo. Amaseva ashicilela futhi abuyekeze into yawo, futhi amaklayenti athatha lonke uhlu alubonise kumdlali. Siphinde sibonise uhlu ekhasini lasekhaya njenge-HTML ukuze abadlali bavele bachofoze kuseva futhi bayiswe ngqo emdlalweni.
  • Ukusayina kuhlobene eduze nokuqaliswa kwethu kwamasokhethi, okuchazwe esigabeni esilandelayo.

Ihambisa umdlalo wabadlali abaningi ukusuka ku-C++ ukuya kuwebhu nge-Cheerp, WebRTC kanye ne-Firebase
Uhlu lwamaseva ngaphakathi kwegeyimu nasekhasini lasekhaya

Ukusetshenziswa kwamasokhethi

Sifuna ukwakha i-API eseduze kakhulu ne-Posix UDP Sockets ukuze sinciphise inani lezinguquko ezidingekayo.

Sifuna futhi ukusebenzisa ubuncane obudingekayo obudingekayo ukuze kube lula ukushintshanisa idatha ngenethiwekhi.

Isibonelo, asiwudingi umzila wangempela: bonke ontanga baku-"virtual LAN" efanayo ehlotshaniswa nesenzakalo sesizindalwazi esithile se-Firebase.

Ngakho-ke, asiwadingi amakheli e-IP ahlukile: amanani okhiye e-Firebase ahlukile (afana namagama esizinda) anele ukuhlonza ontanga ngokuhlukile, futhi untanga ngamunye endaweni unikeza amakheli e-IP "angelomgunyathi" kukhiye ngamunye odinga ukuhunyushwa. Lokhu kusiqeda ngokuphelele isidingo sokunikezwa kwekheli le-IP lomhlaba wonke, okuwumsebenzi ongabalulekile.

Nansi i-API encane okudingeka siyisebenzise:

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

I-API ilula futhi ifana ne-Posix Sockets API, kodwa inomehluko embalwa obalulekile: ukugawula ama-callback, ukwaba ama-IP endawo, nokuxhumana okuvilaphayo.

Ukubhalisa ama-Callback

Noma ngabe uhlelo lwangempela lisebenzisa i-I/O engavimbeli, ikhodi kumele yenziwe kabusha ukuze isebenze kusiphequluli sewebhu.

Isizathu salokhu ukuthi i-loop yomcimbi kusiphequluli ifihliwe ohlelweni (kungaba yi-JavaScript noma i-WebAssembly).

Endaweni yomdabu singabhala ikhodi kanje

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

Uma iluphu yomcimbi isifihlekile, kuzomele siyiguqule ibe yinto efana nalena:

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

Ukunikezwa kwe-IP yendawo

Ama-ID we-node "kunethiwekhi" yethu akuwona amakheli e-IP, kodwa okhiye be-Firebase (bayizintambo ezibukeka kanjena: -LmEC50PYZLCiCP-vqde ).

Lokhu kulula ngoba asiyidingi indlela yokunika ama-IP nokuhlola ukuhluka kwawo (kanye siwalahle ngemva kokuba iklayenti linqamule), kodwa ngokuvamile kuyadingeka ukukhomba ontanga ngenani lenombolo.

Yilokhu kanye imisebenzi esetshenziselwa yona. resolve ΠΈ reverseResolve: Uhlelo lokusebenza ngandlela-thile lithola inani leyunithi yezinhlamvu zokhiye (ngokufaka komsebenzisi noma ngeseva eyinhloko), futhi lingaguqulela ekhelini le-IP ukuze lisetshenziswe ngaphakathi. Yonke enye i-API nayo ithola leli nani esikhundleni seyunithi yezinhlamvu ukuze kube lula.

Lokhu kufana nokubheka i-DNS, kodwa kwenziwa endaweni kuklayenti.

Okusho ukuthi, amakheli e-IP awakwazi ukwabelwa ngawo amaklayenti ahlukene, futhi uma uhlobo oluthile lwesihlonzi somhlaba wonke ludingeka, kuzodingeka lwenziwe ngendlela ehlukile.

Ukuxhumana okuvilaphayo

I-UDP ayidingi uxhumano, kodwa njengoba sesibonile, i-WebRTC idinga inqubo ende yokuxhuma ngaphambi kokuthi iqale ukudlulisa idatha phakathi kontanga ababili.

Uma sifuna ukunikeza izinga elifanayo lokukhipha, (sendto/recvfrom nontanga abanganaki ngaphandle kokuxhumana kwangaphambilini), khona-ke kufanele benze ukuxhumana "okuvilapha" (okubambezelekile) ngaphakathi kwe-API.

Yilokhu okwenzeka ngesikhathi sokuxhumana okuvamile phakathi β€œkweseva” kanye β€œneklayenti” lapho kusetshenziswa i-UDP, kanye nalokho okufanele umtapo wethu wezincwadi kufanele ukwenze:

  • Izingcingo zeseva bind()ukutshela isistimu yokusebenza ukuthi ifuna ukwamukela amaphakethe embobeni eshiwo.

Kunalokho, sizoshicilela imbobo evulekile ku-Firebase ngaphansi kokhiye weseva futhi silalele imicimbi esihlahleni sayo esingaphansi.

  • Izingcingo zeseva recvfrom(), yamukela amaphakethe avela kunoma yimuphi umsingathi kulesi sikhungo.

Esimweni sethu, sidinga ukuhlola ulayini ongenayo wamaphakethe athunyelwe kule port.

Imbobo ngayinye inomugqa wayo, futhi sengeza izimbobo zomthombo nendawo ekuyiwa kuyo ekuqaleni kwedathagram ye-WebRTC ukuze sazi ukuthi yimuphi umugqa okufanele siwudlulisele lapho iphakethe elisha lifika.

Ucingo aluvimbeli, ngakho-ke uma engekho amaphakethe, sivele sibuyele -1 bese sisetha errno=EWOULDBLOCK.

  • Iklayenti ithola i-IP kanye nembobo yeseva ngezindlela ezithile zangaphandle, namakholi sendto(). Lokhu futhi kwenza ikholi yangaphakathi. bind(), ngakho-ke okulandelayo recvfrom() izothola impendulo ngaphandle kokwenza ngokusobala ukubophezela.

Esimweni sethu, iklayenti ngaphandle ithola ukhiye wentambo futhi isebenzisa umsebenzi resolve() ukuthola ikheli le-IP.

Kuleli qophelo, siqala ukuxhawulana kwe-WebRTC uma ontanga ababili bengakaxhumeki komunye nomunye. Izixhumanisi ezimbobeni ezihlukene zontanga efanayo zisebenzisa i-WebRTC DataChannel efanayo.

Senza futhi ngokungaqondile bind()ukuze iseva ikwazi ukuxhuma kabusha kokulandelayo sendto() uma kwenzeka ivaliwe ngesizathu esithile.

Iseva iyaziswa ngoxhumo lweklayenti lapho iklayenti libhala okunikezwayo kwalo kwe-SDP ngaphansi kolwazi lwembobo yeseva ku-Firebase, futhi iseva iphendula ngempendulo yayo lapho.

Umdwebo ongezansi ubonisa isibonelo sokugeleza komlayezo wohlelo lwesokhethi kanye nokudluliselwa komlayezo wokuqala usuka eklayentini uye kuseva:

Ihambisa umdlalo wabadlali abaningi ukusuka ku-C++ ukuya kuwebhu nge-Cheerp, WebRTC kanye ne-Firebase
Qedela umdwebo wesigaba sokuxhuma phakathi kweklayenti neseva

isiphetho

Uma ufunde kuze kube manje, cishe ungathanda ukubona ithiyori isebenza. Umdlalo ungadlalwa teeworlds.leaningtech.com, izame!


Umdlalo wobungani phakathi kozakwethu

Ikhodi yenethiwekhi yelabhulali itholakala mahhala ku I-Github. Joyina ingxoxo esiteshini sethu ku- I-Gitter!

Source: www.habr.com

Engeza amazwana