[ dulesusic @ 04.03.2011. 15:38 ] @
Imam da zavrsim projekat na jednom ispitu koji je zamisljen ovako:

Koristim LPC2468OEM ploču na kojoj je portovan uCLinux. Zmiju imam zavrsenu, ona radi i oko toga nema nikakve price. Sledeci dio zadatka je da na jednom racunaru bude podignut server, a da na druga dva racunara podignemo klijente tako sto cu unutar koda za zmiju dodati i kod za klijent, tako da ja na prvoj ploči na mom displayu vidim obe zmije i upravljam svojom zmijom, a neko drugi za drugim racunarom i drugom plocom igra protiv mene.

Sve se radi u C-u.

Ako neko ima neke predloge kako najjednostavnije da regulisem ovu mreznu komunikaciju, dobrodosao je da me prosvetli.


PS. Ne znam da li sam ubo dobar podforum, ako nisam neka modovi premeste.
[ Mihajlo Cvetanović @ 04.03.2011. 16:32 ] @
Program treba da bude istovremeno i server i klijent, i pre početka partije jedan korisnik otvara igru (i postaje server), a oba korisnika se onda konektuju (i oni su klijenti). Serverski kod je različit od klijentskog. Serverski kod treba da ima jednu select petlju (select je funkcija koja osluškuje sockete) koja čeka na komunikaciju, ali sa tajmautom. Ako istekne tajmaut (od recimo 20ms) onda hendluj pomeranje i crtanje zmija u međuvremenu (gledaš da li je prošla pauza za crtanje, pa ako je prošla onda crtaj novo stanje na ekranu). Ako je stiglo nešto od klijentske konekcije onda hendluj tu komunikaciju (u suštini samo zabeleži da je korisnik skrenuo svoju zmiju, a tu belešku iskoristi za trenutak kad se crta novo stanje), i vrati nazad potvrdnu poruku. Kad dođe vreme za crtanje onda server oboma klijentima pošalje dovoljno podataka da klijenti znaju kako da nacrtaju novo stanje. Poruka treba da bude istovetna za oba klijenta, i da ima informaciju "zmija 1 ide gore i ne menja dužinu, zmija 2 ide levo i zadržava dužinu", eventualno i informacija "kraj igre, zmija 1 je nastradala". Ovo ti omogućava da uvedeš još zmija, sve će lepo da se uklopi. Apsolutno svaka serverska poruka treba da ima svoju potvrdu od strane onog klijenta kome je upućena. Ako do sledećeg trenutka za slanje poruke nije došla potvrda za prethodnu, onda se igra zamrzava, ili čak prekida, jer se komunikacija prekinula. Sama poruka potvrde ne sme da izazove potvrdu u suprotnom pravcu, to nema smisla.

Klijentski kod takođe ima select petlju, u kojoj čeka informacije o tome kako da iscrta novo stanje. I ta petlja mora da bude sa tajmautom, da bi mogao da se hendlujuje i rad sa tastaturom.

Serverski kod mora prvo da otvori osluškujući soket (funkcijom listen), i da sačeka da se na tom socketu konektuju dva klijenta. Tek tada može da počne igra.

Bolje da komunikacija bude TCP nego UDP, čisto da te ne boli glava. Ne praviš WoW nego Snake. TCP ti garantuje da redosled podataka koji se šalju ostaje isti na prijemu. Ne želiš da korisnik pošalje "gore, levo", a server dobije "levo, gore". Treba da isključiš funkcionalnost u TCP/IP steku koja pokušava da gomila poruke za slanje, i tako smanji protok kroz mrežu, jer tebe ne interesuje protok nego brzina. To se radi funkcijom setsockopt sa parametrom TCP_NODELAY.

I, da, još jedna stvar. Klijent može jako brzo da šalje nove pokrete. Moraš da odlučiš da li će server da čuva sve pokrete, pa da ih hendluje po jedan za jedno novo stanje, ili samo onaj koji je poslednji stigao. Oba načina imaju svoje za i protiv, ali drugi način je jednostavniji za programiranje.

Svaka poruka u komunikaciji treba da sadrži dužinu poruke, i telo poruke. Ovo je bitno, jer server će primati od korisnika i poruke za pomeranje zmije, i potvrdne poruke na ono što je sam server poslao. Može da se desi da se te poruke "slepe", i da ih server primi istovremeno. Dužina poruke onda serveru kaže gde je kraj trenutne poruke, a gde počinje sledeća. Isto tako može da se desi da se poruka pocepa prilikom slanja, pa da primalac (i klijent i server) primi samo deo poruke. Dužina poruke ti onda kaže da nisi primio celu poruku. Tada moraš da zapamtiš poruku u prijemnom baferu za tu konekciju, i sačekaš nastavak. Tek kad primiš celu poruku možeš da je hendluješ.
[ dulesusic @ 04.03.2011. 16:58 ] @
Mihajlo, hvala na iscrpnom odgovoru.
Nasao sam na ovom linku kodove za server i klijent pa cu se ovih dan pozabaviti da pogledam da li ovo mogu da iskoristim i da, eventualno, dodam ono sto nedostaje da bih kompletna aplikacija Snake Network radila ono sto je predvidjeno.