Ҳамчун намунаи татбиқи он, мо тасмим гирифтем, ки як бозии мултипликаторро ба веб интиқол диҳем ва интихоб кунем Дунёи иқтисод. Teeworlds як бозии мултипликатори ретро 2D бо ҷомеаи хурд, вале фаъоли бозигарон аст (аз ҷумла ман!). Он ҳам аз ҷиҳати захираҳои зеркашида ва талаботи CPU ва GPU хурд аст - як номзади беҳтарин.
Протоколи тавсифи сессия (СДП) форматест барои тавсифи параметрҳои канали пайвастшавӣ, масалан, номзадҳои ICE, кодекҳои мултимедиявӣ (дар сурати канали аудио/видео) ва ғайра... Яке аз ҳамсолон пешниҳоди SDP мефиристад ва дуюмӣ бо ҷавоби SDP ҷавоб медиҳад. . Пас аз ин, як канал таъсис дода мешавад.
Барои эҷоди чунин пайвастагӣ, ҳамсолон бояд маълумотеро, ки аз серверҳои STUN ва TURN мегиранд, ҷамъоварӣ намуда, бо ҳамдигар мубодила кунанд.
Мушкилот дар он аст, ки онҳо то ҳол қобилияти муоширати мустақим надоранд, бинобар ин, барои мубодилаи ин маълумот бояд механизми берун аз банд мавҷуд бошад: сервери сигнализатсия.
Аз ин рӯ, мо ба суроғаҳои IP-и беназир ниёз надорем: арзишҳои калидии ягонаи Firebase (монанд ба номҳои домейнҳо) барои ба таври беназир муайян кардани ҳамсолон кифояанд ва ҳар як ҳамсол ба таври маҳаллӣ ба ҳар як калид, ки бояд тарҷума шавад, суроғаҳои IP-и "қалбакӣ" таъин мекунад. Ин эҳтиёҷоти таъини суроғаи IP-и умумиро, ки кори ғайриоддӣ аст, комилан аз байн мебарад.
Ин аст ҳадди ақали API, ки мо бояд татбиқ кунем:
// 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 оддӣ ва ба Posix Sockets API шабоҳат дорад, аммо якчанд фарқиятҳои муҳим дорад: сабти зангҳои бозгашт, таъини IP-ҳои маҳаллӣ ва пайвастҳои танбал.
Бақайдгирии зангҳои бозгашт
Ҳатто агар барномаи аслӣ I/O-ро истифода набарад, код бояд барои кор дар браузери веб рефакторатсия карда шавад.
Сабаби ин дар он аст, ки гардиши ҳодиса дар браузер аз барнома пинҳон аст (хоҳ JavaScript ё WebAssembly).
Дар муҳити маҳаллӣ мо метавонем чунин код нависем
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
Таъиноти IP маҳаллӣ
ID-ҳои гиреҳ дар "шабакаи" мо суроғаҳои IP нестанд, балки калидҳои Firebase мебошанд (онҳо сатрҳое мебошанд, ки чунинанд: -LmEC50PYZLCiCP-vqde ).
Ин қулай аст, зеро ба мо механизми таъини IP-ҳо ва санҷиши нотакрории онҳо (инчунин нобуд кардани онҳо пас аз қатъ шудани муштарӣ) лозим нест, аммо аксар вақт зарур аст, ки ҳамсолонро бо арзиши ададӣ муайян кунем.
Маҳз барои ҳамин функсияҳо истифода мешаванд. resolve и reverseResolve: Ариза арзиши сатри калидро ба тариқи муайян қабул мекунад (тавассути вуруди корбар ё тавассути сервери асосӣ) ва метавонад онро ба суроғаи IP барои истифодаи дохилӣ табдил диҳад. Қисми боқимондаи API низ ин арзишро ба ҷои сатр барои содда қабул мекунад.
Ин ба ҷустуҷӯи DNS монанд аст, аммо дар мизоҷ ба таври маҳаллӣ иҷро карда мешавад.
Яъне, суроғаҳои IP-ро дар байни муштариёни гуногун тақсим кардан мумкин нест ва агар ягон намуди идентификатори глобалӣ лозим шавад, он бояд бо роҳи дигар тавлид шавад.
Пайвастшавӣ суст
UDP ба пайвастшавӣ ниёз надорад, аммо тавре ки мо дидем, WebRTC пеш аз он ки интиқоли маълумот байни ду ҳамсолро оғоз кунад, раванди тӯлонии пайвастшавиро талаб мекунад.
Агар мо хоҳем, ки ҳамон сатҳи абстраксияро таъмин кунем, (sendto/recvfrom бо ҳамсолони худсарона бидуни пайвасти пешакӣ), пас онҳо бояд дар дохили API пайвасти "танбал" (таъхир) анҷом диҳанд.
Ин аст он чизе ки ҳангоми муоширати муқаррарии байни "сервер" ва "мизоҷ" ҳангоми истифодаи UDP рӯй медиҳад ва китобхонаи мо бояд чӣ кор кунад: