WinSock palīdzība

Vieta, kur parunāt par to, kas nav atsevišķi izdalīts augstāk
Message
Author
bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#11 Post by bubu » 09 Sep 2011, 00:31

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.

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#12 Post by CodeWolf » 20 Sep 2011, 21:33

Jā bet kā lai pēc tam (otrā pusē jeb Klienta/Serverī) nolasa un izdala nosūtītos datus?
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#13 Post by bubu » 20 Sep 2011, 21:49

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

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#14 Post by CodeWolf » 29 Sep 2011, 22:24

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)
:?
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#15 Post by bubu » 30 Sep 2011, 08:33

A kāda starpība kādu precīzi id klienti iegūst? Galvenais taču, ka tie ir unikāli.

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#16 Post by CodeWolf » 30 Sep 2011, 22:49

ēm nu lai veiktu tadas darbibas kā sūtišanu.. saņemšanu..attiecigajam klientam...
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#17 Post by bubu » 01 Oct 2011, 01:17

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?

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#18 Post by CodeWolf » 01 Oct 2011, 12:03

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:
//OpenGL

snake5
Posts: 361
Joined: 07 Dec 2010, 03:54
Contact:

Re: WinSock palīdzība

#19 Post by snake5 » 01 Oct 2011, 12:19

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.
Last edited by snake5 on 01 Oct 2011, 12:20, edited 1 time in total.

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#20 Post by bubu » 01 Oct 2011, 12:19

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.

Post Reply

Return to “Programmēšana / Programming”