Ho fana ka papali ea libapali tse ngata ho tloha ho C++ ho ea inthaneteng ka Cheerp, WebRTC le Firebase

Selelekela

khampani ea rona Leaning Technologies e fana ka litharollo bakeng sa ho tsamaisa lits'ebetso tsa komporo tsa khale ho tepo. Moqapi oa rona oa C++ thabang e hlahisa motsoako oa WebAssembly le JavaScript, e fanang ka bobeli tšebelisano e bonolo ea sebatli, le tshebetso e phahameng.

E le mohlala oa ts'ebeliso ea eona, re nkile qeto ea ho kenya papali ea libapali tse ngata ho webosaete mme ra khetha Bacha. Teeworlds ke papali ea libapali tsa XNUMXD retro e nang le libapali tse nyane empa tse mafolofolo (ho kenyeletsoa le nna!). E nyane ho latela lisebelisoa tse jarollotsoeng le litlhoko tsa CPU le GPU - mokhethoa ea loketseng.

Ho fana ka papali ea libapali tse ngata ho tloha ho C++ ho ea inthaneteng ka Cheerp, WebRTC le Firebase
E sebetsa ho sebatli sa Teeworlds

Re nkile qeto ea ho sebelisa morero ona ho etsa liteko litharollo tse akaretsang tsa ho tsamaisa khoutu ea marang-rang ho webo. Hangata sena se etsoa ka litsela tse latelang:

  • XMLHttpRequest/fetch, haeba karolo ea marang-rang e na le likopo tsa HTTP feela, kapa
  • Li-WebSocket.

Litharollo ka bobeli li hloka ho amohela karolo ea seva ka lehlakoreng la seva, 'me ha e lumelle ho sebelisoa joalo ka protocol ea lipalangoang UDP. Sena ke sa bohlokoa bakeng sa lits'ebetso tsa nako ea nnete joalo ka software ea seboka sa video le lipapali, hobane e tiisa ho tsamaisoa le tatellano ea lipakete tsa protocol. TCP e ka ba tšitiso ho low latency.

Ho na le tsela ea boraro - sebelisa marang-rang ho tsoa ho sebatli: WebRTC.

RTCDataChannel E ts'ehetsa phetisetso e ka tšeptjoang le e sa tšepahaleng (tabeng ea ho qetela e leka ho sebelisa UDP e le protocol ea lipalangoang neng kapa neng ha ho khoneha), mme e ka sebelisoa ka bobeli ka seva e hole le lipakeng tsa li-browser. Sena se bolela hore re ka kenya ts'ebeliso eohle ho sebatli, ho kenyelletsa le karolo ea seva!

Leha ho le joalo, sena se tla le bothata bo eketsehileng: pele lithaka tse peli tsa WebRTC li ka buisana, li hloka ho ts'oarana ka matsoho ka mokhoa o rarahaneng ho hokahanya, e leng se hlokang mekhatlo e mengata ea batho ba boraro (seva sa pontšo le seva se le seng kapa ho feta. TSIETSO/FETOLA).

Ka mokhoa o nepahetseng, re ka rata ho theha API ea marang-rang e sebelisang WebRTC ka hare, empa e haufi haholo le UDP Sockets interface e sa hlokeng ho theha khokahanyo.

Sena se tla re lumella ho nka monyetla ka WebRTC ntle le ho pepesa lintlha tse rarahaneng ho khoutu ea kopo (eo re neng re batla ho e fetola hanyane kamoo ho ka khonehang morerong oa rona).

Bonyane WebRTC

WebRTC ke sehlopha sa li-API tse fumanehang ho li-browser tse fanang ka phetisetso ea lithaka tsa lithaka tsa audio, video le data e sa reroang.

Khokahano lipakeng tsa lithaka e thehiloe (leha ho na le NAT ka lehlakoreng le le leng kapa ka bobeli) ho sebelisoa li-server tsa STUN le/kapa TURN ka mochini o bitsoang ICE. Lithaka li fapanyetsana tlhahisoleseling ea ICE le liparamente tsa seteishene ka tlhahiso le karabo ea protocol ea SDP.

Joooh! Ke likhutsufatso tse kae ka nako e le 'ngoe? Ha re hlalose ka bokhutšoanyane hore na mantsoe ana a bolela eng:

  • Lisebelisoa tsa Session Traversal Utility bakeng sa NAT (TSIETSO) - protocol ea ho feta NAT le ho fumana para (IP, port) bakeng sa ho fapanyetsana data ka kotloloho le moamoheli. Haeba a khona ho phethela mosebetsi oa hae, joale lithaka li ka fapanyetsana data ka boithaopo.
  • Ho potoloha ho sebelisa li-Relay ho potoloha NAT (FETOLA) e boetse e sebelisoa bakeng sa traversal ea NAT, empa e sebelisa sena ka ho fetisa data ka proxy e bonahalang ho lithaka ka bobeli. E eketsa latency mme e theko e boima haholo ho e kenya ts'ebetsong ho feta STUN (hobane e sebelisoa ho pholletsa le nako eohle ea puisano), empa ka linako tse ling ke eona feela khetho.
  • Ho theha Khokahano e Kopanetsoeng (Ice) e sebelisetsoang ho khetha mokhoa o molemo ka ho fetisisa oa ho hokahanya lithaka tse peli ho latela boitsebiso bo fumanoeng ho hokahanya lithaka ka ho toba, hammoho le tlhahisoleseding e fumanoang ke palo leha e le efe ea li-server tsa STUN le TURN.
  • Session Description Protocol (RDS) ke mokhoa oa ho hlalosa li-parameter tsa mocha oa khokahanyo, mohlala, likhetho tsa ICE, li-codec tsa multimedia (tabeng ea mocha oa molumo / video), joalo-joalo ... E mong oa lithaka o romela SDP Offer, 'me oa bobeli o arabela ka SDP Karabo. . . Ka mor'a sena, mocha o etsoa.

Ho theha khokahano e joalo, lithaka li hloka ho bokella tlhahisoleseling eo ba e fumanang ho li-server tsa STUN le TURN le ho li fapanyetsana.

Bothata ke hore ha ba e-s'o be le bokhoni ba ho buisana ka ho toba, kahoo mochine o tsoang ka ntle ho sehlopha o tlameha ho ba teng ho fapanyetsana data ena: seva sa pontšo.

Seva ea lipontšo e ka ba bonolo haholo hobane mosebetsi oa eona feela ke ho fetisa data pakeng tsa lithaka tsa mokhahlelo oa ho ts'oarana ka matsoho (joalo ka ha ho bonts'itsoe setšoantšong se ka tlase).

Ho fana ka papali ea libapali tse ngata ho tloha ho C++ ho ea inthaneteng ka Cheerp, WebRTC le Firebase
Setšoantšo se nolofalitsoeng sa ho ts'oarana ka letsoho sa WebRTC

Teeworlds Network Model Overview

Mehaho ea marang-rang ea Teeworlds e bonolo haholo:

  • Likarolo tsa bareki le seva ke mananeo a mabeli a fapaneng.
  • Bareki ba kenya papali ka ho hokela ho e 'ngoe ea li-server tse' maloa, e 'ngoe le e 'ngoe ea tsona e tšoara papali e le 'ngoe feela ka nako.
  • Phetiso eohle ea data papaling e etsoa ka seva.
  • Seva e khethehileng ea master e sebelisoa ho bokella lenane la li-server tsohle tsa sechaba tse bonts'itsoeng ho moreki oa papali.

Ka lebaka la ts'ebeliso ea WebRTC bakeng sa phapanyetsano ea data, re ka fetisetsa karolo ea seva ea papali ho sebatli moo moreki a leng teng. Sena se re fa monyetla o moholo...

Tlosa li-server

Ho haella ha mohopolo oa seva ho na le molemo o motle: re ka tsamaisa ts'ebeliso eohle e le litaba tse sa fetoheng ho Github Pages kapa ho lisebelisoa tsa rona tse ka morao ho Cloudflare, ka hona re netefatsa ho khoasolla ka potlako le nako e phahameng ea mahala. Ha e le hantle, re ka lebala ka bona, 'me haeba re le mahlohonolo' me papali e fetoha e ratoang, joale lisebelisoa tsa motheo li ke ke tsa tlameha ho ntlafatsoa.

Leha ho le joalo, hore sistimi e sebetse, re ntse re tlameha ho sebelisa meralo ea kantle:

  • Seva e le 'ngoe kapa tse ngata tsa STUN: Re na le likhetho tse' maloa tsa mahala tseo re ka khethang ho tsona.
  • Bonyane seva se le seng sa TURN: ha ho na likhetho tsa mahala mona, kahoo re ka iketsetsa rona kapa ra lefa bakeng sa ts'ebeletso. Ka lehlohonolo, boholo ba nako khokahanyo e ka thehoa ka li-server tsa STUN (le ho fana ka p2p ea 'nete), empa TURN e hlokahala e le khetho ea ho khutlela morao.
  • Seva ea Letšoao: Ho fapana le likarolo tse ling tse peli, ho saena ha hoa lekana. Seo seva sa lipontšo se tla ikarabella ho sona se itšetlehile ka mokhoa o itseng oa kopo. Tabeng ea rona, pele ho theha khokahano, hoa hlokahala ho fapanyetsana palo e nyane ea data.
  • Teeworlds Master Server: E sebelisoa ke li-server tse ling ho phatlalatsa boteng ba tsona le ke bareki ho fumana li-server tsa sechaba. Le hoja e sa hlokehe (bareki ba ka khona ho hokahanya le seva eo ba e tsebang ka letsoho), ho ka ba monate ho ba le e le hore libapali li ka kenya letsoho lipapaling le batho ba sa tloaelehang.

Re nkile qeto ea ho sebelisa li-server tsa STUN tsa mahala tsa Google, 'me ra sebelisa TURN e le 'ngoe ka borona.

Bakeng sa lintlha tse peli tse fetileng tseo re li sebelisitseng Setsi sa mollo:

  • Seva e kholo ea Teeworlds e kengoa tšebetsong ka mokhoa o bonolo haholo: joalo ka lethathamo la lintho tse nang le tlhaiso-leseling (lebitso, IP, 'mapa, mokhoa, ...) ea seva se seng le se seng se sebetsang. Li-server li phatlalatsa le ho ntlafatsa ntho ea tsona, 'me bareki ba nka lenane lohle ebe ba le bontša sebapali. Re boetse re bonts'a lenane leqepheng la lehae e le HTML hore libapali li ka tobetsa feela ho seva ebe li isoa papaling ka kotloloho.
  • Letšoao le amana haufi-ufi le ts'ebetsong ea li-sockets, tse hlalositsoeng karolong e latelang.

Ho fana ka papali ea libapali tse ngata ho tloha ho C++ ho ea inthaneteng ka Cheerp, WebRTC le Firebase
Lethathamo la li-server tse ka hare ho papali le leqepheng la lehae

Ts'ebetsong ea li-sockets

Re batla ho theha API e haufi le Posix UDP Sockets kamoo ho ka khonehang ho fokotsa palo ea liphetoho tse hlokahalang.

Re boetse re batla ho kenya ts'ebetsong bonyane bo hlokahalang bakeng sa phapanyetsano e bonolo ka ho fetisisa ea data holim'a marang-rang.

Mohlala, ha re hloke tsela ea 'nete: lithaka tsohle li ho "LAN" e ts'oanang e amanang le mohlala oa polokelo ea boitsebiso ba Firebase.

Ka hona, ha re hloke liaterese tse ikhethang tsa IP: boleng bo ikhethang ba Firebase (ho tšoana le mabitso a domain) bo lekane ho khetholla lithaka, 'me thaka e 'ngoe le e 'ngoe sebakeng sa heno e fana ka liaterese tsa "IP" tsa "fake" ho senotlolo ka seng se hlokang ho fetoleloa. Sena se felisa ka botlalo tlhoko ea ho abela aterese ea IP ea lefats'e, e leng mosebetsi o sa reng letho.

Mona ke bonyane API eo re hlokang ho e sebelisa:

// 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 e bonolo ebile e tšoana le Posix Sockets API, empa e na le liphapang tse 'maloa tsa bohlokoa: ho rema li-callbacks, ho abela li-IP tsa lehae, le likhokahano tse botsoa.

Ho Ngolisa Li-Callbacks

Leha lenaneo la mantlha le sebelisa I/O e sa thibeleng, khoutu e tlameha ho hlophisoa bocha hore e sebetse ho sebatli sa marang-rang.

Lebaka la sena ke hore loop ea ketsahalo ho sebatli e patiloe lenaneong (e be JavaScript kapa WebAssembly).

Sebakeng sa tlhaho re ka ngola khoutu tjena

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

Haeba loop ea ketsahalo e patiloe ho rona, joale re hloka ho e fetola ntho e kang ena:

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

Mosebetsi oa lehae oa IP

Li-ID tsa "node" ho "network" ea rona ha se liaterese tsa IP, empa linotlolo tsa Firebase (ke likhoele tse shebahalang tjena: -LmEC50PYZLCiCP-vqde ).

Sena se bonolo hobane ha re hloke mokhoa oa ho abela li-IP le ho hlahloba bo ikhethang ba tsona (hammoho le ho li lahla ka mor'a hore moreki a khaotsoe), empa hangata hoa hlokahala ho khetholla lithaka ka boleng ba linomoro.

Sena ke sona hantle seo mesebetsi e se sebelisetsoang. resolve и reverseResolve: Sesebelisoa ka tsela e itseng se amohela boleng ba mohala oa senotlolo (ka ho kenya mosebelisi kapa ka seva se seholo), mme se ka se fetolela atereseng ea IP bakeng sa ts'ebeliso ea kahare. Ba bang kaofela ba API le bona ba fumana boleng bona ho fapana le khoele bakeng sa bonolo.

Sena se tšoana le ho sheba DNS, empa se etsoa sebakeng sa heno ho moreki.

Ke hore, liaterese tsa IP li ke ke tsa arolelanoa pakeng tsa bareki ba fapaneng, 'me haeba ho hlokahala mofuta o itseng oa sekhetho sa lefats'e, se tla tlameha ho hlahisoa ka tsela e fapaneng.

Khokahano e botsoa

UDP ha e hloke khokahano, empa joalo ka ha re bone, WebRTC e hloka ts'ebetso e telele ea khokahano pele e qala ho fetisetsa data lipakeng tsa lithaka tse peli.

Haeba re batla ho fana ka boemo bo tšoanang ba ho tlosa, (sendto/recvfrom le lithaka tse hanyetsanang ntle le khokahano ea pele), joale ba tlameha ho etsa khokahano ea "botsoa" (e liehang) ka hare ho API.

Sena ke se etsahalang nakong ea puisano e tloaelehileng lipakeng tsa "seva" le "mosebetsi" ha a sebelisa UDP, le seo laeborari ea rona e lokelang ho se etsa:

  • Li-call tsa seva bind()ho bolella sistimi ea ts'ebetso hore e batla ho amohela lipakete boema-kepeng bo boletsoeng.

Ho e-na le hoo, re tla phatlalatsa sebaka se bulehileng ho Firebase tlas'a senotlolo sa seva 'me re mamele liketsahalo ka har'a eona.

  • Li-call tsa seva recvfrom(), ho amohela lipakete tse tsoang ho moamoheli ofe kapa ofe boema-kepeng bona.

Tabeng ea rona, re hloka ho hlahloba mokoloko o kenang oa lipakete tse rometsoeng boema-kepeng bona.

Boema-kepe bo bong le bo bong bo na le mokoloko oa bona, 'me re eketsa mohloli le likou tsa libaka qalong ea li-datagrams tsa WebRTC e le hore re tsebe hore na re tla fetisetsa moeli ofe ha pakete e ncha e fihla.

Mohala ha o thibele, kahoo haeba ho se na lipakete, re khutlela feela -1 ebe re beha errno=EWOULDBLOCK.

  • Moreki o amohela IP le boema-kepe ba seva ka mekhoa e meng ea kantle, le mehala sendto(). Sena se boetse se etsa mohala oa ka hare. bind(), ka hona e latelang recvfrom() e tla fumana karabo ntle le ho etsa tlamo e hlakileng.

Tabeng ea rona, moreki ka ntle o amohela senotlolo sa khoele mme o sebelisa mosebetsi resolve() ho fumana aterese ea IP.

Mothating ona, re qala ho ts'oarana ka letsoho ho WebRTC haeba lithaka tse peli li e-so hokahane. Lihokelo ho likoung tse fapaneng tsa lithaka tse tšoanang li sebelisa WebRTC DataChannel e tšoanang.

Re boetse re etsa ka tsela e sa tobang bind()e le hore seva se ka hokela hape nakong e tlang sendto() haeba e ne e koalehile ka lebaka le itseng.

Seva e tsebisoa ka khokahano ea moreki ha moreki a ngola tlhahiso ea eona ea SDP tlasa tlhaiso-leseling ea boema-kepe ho Firebase, 'me seva e araba ka karabo ea eona moo.

Setšoantšo se ka tlase se bontša mohlala oa phallo ea molaetsa bakeng sa morero oa socket le phetiso ea molaetsa oa pele ho tloha ho moreki ho ea ho seva:

Ho fana ka papali ea libapali tse ngata ho tloha ho C++ ho ea inthaneteng ka Cheerp, WebRTC le Firebase
Setšoantšo se felletseng sa karolo ea khokahano lipakeng tsa moreki le seva

fihlela qeto e

Haeba u balile ho fihlela mona, mohlomong u thahasella ho bona khopolo e sebetsa. Papali e ka bapaloa teeworlds.leaningtech.com, leka!


Papali ea botsoalle pakeng tsa basebetsi-'moho

Khoutu ea laeborari ea marang-rang e fumaneha mahala ho Github. Kena moqoqong oa mocha oa rona ho Gitter!

Source: www.habr.com

Eketsa ka tlhaloso