Page 2 of 4

Re: WinSock palīdzība

Posted: 09 Sep 2011, 00:31
by bubu
Tu UDP protokolu lieto? UDP protokolā pakešu secība nav definēta. Otrā nosūtītā var atnāk pirms pirmās nosūtītās.

Parasti sūtāmo informāciju saraksta vienā baitu buferī un to sūta uzreiz - ar vienu send'u. Parasti tajā iekļauj arī paketes tipu, lai zinātu, kas ir atnācis. Ignorējot little/big -endian atšķirības, vienkāršots kods izskatītos šādi:

Code: Select all

char buffer[100];
char* p = buffer;
*p++ = 1; // 1 = pozīcija, rotācijai lieto kautko citu, piemēram 2, kautkas cits, piemēram iziet no spēles nozīmētu 3, utt
memcpy(p, position.X, sizeof(position.X); p += sizeof(position.X);
memcpy(p, position.Y, sizeof(position.Y); p += sizeof(position.Y);
memcpy(p, position.Z, sizeof(position.Z); p += sizeof(position.Z);

int buffer_size = p - buffer;
send(socket, buffer, size);
Ja tie X/Y/Z ir float'i, tad parasti jau float'us nesūta - 12 baiti uz pozīciju ir daudz. Parasti sūta vai nu relatīvas izmaiņas, vai arī kvantizētus datus, t.i. integer skaitli no 0 līdz piemēram 1024, kas nozīmē - no viena laukuma malas līdz otrai, un tad saņēmēja galā pārveido to atpakaļ uz float'u.

Ja interesē, tad lūk kods kā es to darīju Squares 3D spēlei:
faili, kuri apstrādā datu ielikšanu/izņemšanu baitu buferī: packet.h, packet.cpp.
faili, kuri atbild par tīkla baitu bufera sūtīšanu/saņemšanu: network.h, network.cpp (jāskatās Network::update un Network::processPacket metodes.
Kods gan nav īpaši glīts (tika sasteigts pēdējās Indago 2k6 dienās), un netiek izmantoti tīri BSD soketi pa tiešo. Es lietoju enet bibliotēku, kas nodrošināja uzticamu UDP protokolu. Bet principi paliek līdzīgi - piekonektējies, un sūti datus, vai piebindojies un saņem datus.

Re: WinSock palīdzība

Posted: 20 Sep 2011, 21:33
by CodeWolf
Jā bet kā lai pēc tam (otrā pusē jeb Klienta/Serverī) nolasa un izdala nosūtītos datus?

Re: WinSock palīdzība

Posted: 20 Sep 2011, 21:49
by bubu
Loģiski, ka jālasa tieši tāpat, tikai kopēšana jāveic uz otru pusi:

Code: Select all

char buffer[100];
int size = ...;
receive(socket, buffer, size);

char* p = buffer;
if (*p++ == 1) // iedomājamies, ka būs pozīcija atnākusi
{
    memcpy(&position.X, p, sizeof(position.X); p += sizeof(position.X);
    memcpy(&position.Y, p, sizeof(position.Y); p += sizeof(position.Y);
    memcpy(&position.Z, p, sizeof(position.Z); p += sizeof(position.Z);
}
else ...

Re: WinSock palīdzība

Posted: 29 Sep 2011, 22:24
by CodeWolf
o paldies (: viss strada labi, tikai vienigais tagad nezinu ka lai pareizi uztaisa to ka Speletaja pozicija tiek nosutita serverim un serveris aizsuta parejiem klientiem.(neieskaitot pašu)
+ ka lai atbrivo ID slotu
jo sanak ta ka
1. klients piesledzas id=1
nakamais piesledzas id=2;
1 klients iziet ...
3 klients piesledzas un iegust id 3 nevis 1(kurš ir briivs)
:?

Re: WinSock palīdzība

Posted: 30 Sep 2011, 08:33
by bubu
A kāda starpība kādu precīzi id klienti iegūst? Galvenais taču, ka tie ir unikāli.

Re: WinSock palīdzība

Posted: 30 Sep 2011, 22:49
by CodeWolf
ēm nu lai veiktu tadas darbibas kā sūtišanu.. saņemšanu..attiecigajam klientam...

Re: WinSock palīdzība

Posted: 01 Oct 2011, 01:17
by bubu
Trešajam klientam tad sūti id 3, nevis 1. Kur ir problēma?
Pieslēdzas jauns klients - uzģenerējam/pieglabājam viņa id - un to arī izmantojam sūtīšanā/saņemšanā. Ne?

Re: WinSock palīdzība

Posted: 01 Oct 2011, 12:03
by CodeWolf
Nū bet ja ta vislaik skaitisies tad pedejam klientam (pienemsim dienas beigas id bus 2143... id(lai gan speletaji bija tikai 3 un pieslēdzās entās reizes.. :roll:

Re: WinSock palīdzība

Posted: 01 Oct 2011, 12:19
by snake5
Un kur ir problēma? ID ģenerēšanu jebkurā brīdī var aizvietot ar kaut ko labāku (jo tā notiek tikai serverī). Vispirms iesaku izveidot spēli, kuru gribēs spēlēt tik daudz cilvēku. :)
32 bitu (unsigned) int spēs iedot 2^32 = 4294967296 unikālus ID. Ja vidēji 1 jauns klients pieslēdzas 1 minūtē, vajadzētu ~8166 gadus, lai tiktu līdz beigām.

Re: WinSock palīdzība

Posted: 01 Oct 2011, 12:19
by bubu
Jā, tieši tā - dienas beigās būs 2143. Un kas tev ir pret skaitli 2143? Lai arī ir tas 2143. Ko tas maina lietas būtībai?
Ja tu uztraucies par to, ka integeru beigsies - tas nekas, pēc laika tie sāks wrapoties apkārt uz 0. Vienīgais, ko šis neļaus, ir vienlaicīgi pieslēgtus vairāk par 2^32 (ja lieto unsigned int'us) klientus.