Networking Question

Vēlies radīt spēli, bet nezini ar ko sākt? Sperot pirmos soļus, vari meklēt padomu šeit
Message
Author
CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: Networking Question

#11 Post by CodeWolf » 13 Jan 2012, 19:04

hmm ja pareizi sapratu
tad..
void storeBits(unsigned int x, int bitCount)
pie
unsigned int x
- piem poziciju
un
pie bitCount - bitu skaitu kuru velos iegūt?
storeBits(PozicijaX,8);
ja ta ir pareizi tad kur es norādu bufferim kuru sūtīšu vērtību?
piem

Code: Select all

itoa(pozicija,bufferis,2);
?
Un tad write funkcija rakstu bufferi..?
bsOut.Write(bufferis);
//OpenGL

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

Re: Networking Question

#12 Post by bubu » 13 Jan 2012, 19:32

Nesapratu nekā. Kas tev buferim jānorāda tur? Kāds vēl itoa?
Tev ir skaitļi x, y, z, no kuriem tu gribi sūtīt teiksim 10 bitus (katram)
Ieraksti tos buferī:

Code: Select all

initBits();
storeBits(x, 10);
storeBits(y, 10);
storeBits(z, 10);
un tad sūti pa tīklu saglabātos datus:

Code: Select all

int bufferByteCount = (filledBits+7)/8;
write_to_socket(buffer, bufferByteCount);

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

Re: Networking Question

#13 Post by CodeWolf » 13 Jan 2012, 19:50

njam lidz tai sutišanai pareizi biju sapratis ..
Bet man katrai funkcijai nevajag jaunu buferi gadījumā?
+ otrā puse lai saņemtu datus vajadzēs tak citu kodu vaine..?
+(par to itoa)zinot to ka chars vis mazak aizņem domāju ka sadalitais skaitlis jajievieto tajā..
//OpenGL

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

Re: Networking Question

#14 Post by bubu » 13 Jan 2012, 22:57

Tev katrai sūtīšanai vajag jaunu buferi - vismaz vajag pa jaunam sākt rakstīt tajā, nav obligāti jaunu objektu taisīt.
Jā, otrā pusē, lai saņemtu datus, vajadzēs funkcionalitāti, kas bitus nolasīs no bufera, nevis rakstīs tajā (loģiski).

Int skaitlis ar itoa "pārveidots" par čariem ne vienmēr aizņems mazāk vietas.
Skaties:

Code: Select all

int x = 761; // aizņem 4 baitus
storeBits(x, 32); // saglabās buferī 4 baitus = 32 biti

char str[...];
itoa(x, str, 2);
// Tagad str buferī atrodas:
// str[0] = '1';
// str[1] = '0';
// str[2] = '1';
// str[3] = '1';
// str[4] = '1';
// str[5] = '1';
// str[6] = '1';
// str[7] = '0';
// str[8] = '0';
// str[9] = '1';
// str[10] = 0;
11 baiti ir vairāk kā 4, ne?

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

Re: Networking Question

#15 Post by CodeWolf » 14 Jan 2012, 02:14

ehh čota kautkas nesanāk.. nosutot datus ... laikam isti nekas nenolasas.. izmantoju otra pusē līdzīgu kodu..
tikai nezinu kura vietā kas tur īsti ir jāmaina..
:( C++ nepārzinu tik labi lai pats sastādītu+ pirmajā kursā neko tadu vel nemāca..
Šodien ari jautāju nodaļas vadītājam par dalīšanu bitos viņš tik teica ,ka ir dzirdējis bet īsti neko pateikt nevarot..

gadījum buferi nevar notīrīt ar
delete [] buffer;
funkciju?
+ vai tas vispār ir nepieciešams.. jo visa sūtīšana saņemšana atrodas iekš case..
un ja nemaldos tad katrā case vertibas resetojas..
//OpenGL

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

Re: Networking Question

#16 Post by bubu » 14 Jan 2012, 04:56

Ar delete [] atbrīvo atmiņu, kura tikusi izdalīta ar new [..]
Ja mainīgais nesatur pointeri uz atmiņu, kas izdarlīta ar new [..], tad uz to kategoriski nedrīkst izsaukt delete [].

Ar vārdu "notīrīt" es biju domājis pierakstīt pilnu ar 0. C stilā to var izdarīt ar memset(pointeris_uz_atmiņu, 0, izmērs_baitos);

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

Re: Networking Question

#17 Post by CodeWolf » 14 Jan 2012, 18:15

Nu bet tajā kodā ko devi viņš tak jau tiek pipildits ar nullem

Code: Select all

memset(bufferis        ,               0   ,   sizeof(bufferis));
              ^
Chars-----|                             ^
Simboli ar kuriem velos aizvietot--|         ^
Izmers----------------------------------|

Pec tā sanāk ka viņš visu jau piepilda a nullem..
+ kā lai atjauno bitus otra pusē..?
//OpenGL

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

Re: Networking Question

#18 Post by bubu » 14 Jan 2012, 23:55

Code: Select all

char buf[..];
int bufPos;

// nolasam datus no tīkla
socket->read(buf, ... );
bufPos = 0;

int readBits(int bitCnt)
{
    int x = 0;
    for (int i=0; i<bitCnt; i++)
    {
        x |= ((buf[bufPos/8]>>(bufPos%8))&1) << i;
        bufPos++;
    }
    return x;
}

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

Re: Networking Question

#19 Post by CodeWolf » 15 Jan 2012, 01:15

hmm es itka ievadiju kodu bet otra puse kur vajadzetu saņemt uzradišanas brīdi x,y,z=0;
skatijos titka nekur nesmu neko nepreizi ievadijis :?
klients:

Code: Select all

if(  connected && positionTimeout==1)
	{
    bsOut.Reset();
	
	bsOut.Write((RakNet::MessageID)POSITION_UPDATE);
	x =(float)current_position.x;
	y =(float)current_position.y;
	z =(float)current_position.z;
	initBits();
	storeBits(x,10);
	storeBits(y,10);
	storeBits(z,10);
	int bufferByteCout=(filledBits+7)/8;
	bsOut.Write(client_id);
	bsOut.Write((char*)buffer,bufferByteCout);
    peer->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,server_address,false);
    }
Serveris

Code: Select all

   break;
        case POSITION_UPDATE:
          // received new position from client
		
			
			bsIn.Read(client_id);
			bsIn.Read(buffer2,sizeof(buffer2));
			bufferPos=0;
			
			readBits(x);
			readBits(y);
			readBits(z);
          printf("Client %d sent new position %d,%d\n", client_id, x,y);
//OpenGL

albertsmuktupavels
Posts: 54
Joined: 07 Dec 2010, 12:45

Re: Networking Question

#20 Post by albertsmuktupavels » 15 Jan 2012, 03:42

Ja pareizi izsekoju līdzi, tad būtu jābūt šādi:

Code: Select all

x=readBits(10);
y=readBits(10);
z=readBits(10);

Post Reply

Return to “Iesācējiem / For beginners”