Re: WinSock palīdzība
Posted: 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:
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.
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 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.