Page 1 of 4

WinSock palīdzība

Posted: 04 Sep 2011, 14:42
by CodeWolf
Sveiki, vai kāds nevarētu nedaudz izpalīdzēt. Lieta tāda ka vēlos izveidot nelielu serveri un klientu.. (tā lai serveris atjaunotu X,Y pozicijias un klients vienkārši tās attēlotu ar spraitu palidzibu..)
itkā to esmu izdarijis ,bet nezinu kā pareizi ievietot kodu Update funkcijā tā lai regulāri x,y pozicijas tiktu atjaunotas un nosutitas ...
:/ + tagad palaižot serveri un klientu savienojuma bridi klienta logs vienkarši nokarās. :roll:
Serveris
http://pastebin.com/mZkVtbR5
Klients
http://pastebin.com/QDgew9Ls

Re: WinSock + OpenGL

Posted: 04 Sep 2011, 16:11
by snake5
1. te nav nekāda sakara ar OpenGL. ;)
2. ieliec breakpointus / lieto step funkcijas debuggerim, lai noteiktu, kur tieši uzkārās klients.

Daudz gan tur laikam nav, ko meklēt, jo izskatās, ka tiek lietoti TCP socketi blocking režīmā (t.i. neatgriezīsies no recv kamēr nebūs kaut kas atsūtīts). Paņem savu tutoriāli un aizrocies līdz sadaļām par UDP un non-blocking socketiem, tad visam vajadzētu kļūt skaidrākam.

Re: WinSock + OpenGL

Posted: 04 Sep 2011, 17:39
by bubu
Nav jau ne vainas lietot soketus blocking modē un TCP protokola soketus. Vajag tikai pirms recv izsaukšanas pārliecināties, ka ir dati atnākuši (select fja), tad recv nebloķēs threadu. Tb tādā gadījumā tipiski kodu ir strukturēt šādi:

Code: Select all

if (ir atnākuši dati no tīkla)
{
   dati = nolasam no tīkla ar recv;
   apstrādājam datus;
}
daram tipisko spēles loģiku + renderēšnu

Re: WinSock + OpenGL

Posted: 04 Sep 2011, 19:54
by CodeWolf
if (ir atnākuši dati no tīkla)
{
dati = nolasam no tīkla ar recv;
apstrādājam datus;
}
daram tipisko spēles loģiku + renderēšnu
kā var pārliecinaties par to vai dati ir atnakuši no tikla?
funkcijai
if (ir atnākuši dati no tīkla)

Re: WinSock + OpenGL

Posted: 04 Sep 2011, 21:25
by snake5
bubu wrote:Vajag tikai pirms recv izsaukšanas pārliecināties, ka ir dati atnākuši (select fja)
http://msdn.microsoft.com/en-us/library ... s.85).aspx

Re: WinSock palīdzība

Posted: 06 Sep 2011, 23:55
by CodeWolf
hmm, paldies... man radas neliels jautajums , kā var atjaunot tādu lietu ka pozicijas sutišanu...?
es itka iemetu send un recive funkcijas iekš update, itka vis strada tikai rodas tada sajuta ka viņš nevis atjauno bet gan suta pa virsu un vairak reiz parrakstot serveris un klients sak iebremzēt... Nav kads veids ka var nosutit un veco info nodzest vai ka ta?

Re: WinSock palīdzība

Posted: 07 Sep 2011, 10:23
by snake5
Atjaunot?
Kad pozīcija tiek sūtīta, otrā galā kāds to saņem un pārraksta mainīgos. Neko īpašu tur nevajag, lai viss kaut vai tā strādātu.
Nevar vienīgi sūtīt pārāk bieži, citādi kaut kas tiešām iebremzēs...

Re: WinSock palīdzība

Posted: 07 Sep 2011, 18:08
by CodeWolf
nuu es izdariju ta ka uzliku tadu ka taimeriti...iekš update funkcijas..
int taimeris=0;
//update
taimeris++;
if(taimeris>40)
{
send("char",sizeof(..),...);
taimeris=0;
}
bet sanak ta ka ta pozicija atjaunojas tikai peec kada laika .. un izskatas ka lago itka piereizinaju klat veel laiku.. beet tas isti nepalidz -_-
jo biežak sutu jo vairak lago klients.. nez kas butu ja butu 2vi klienti,liekas ka visp nokartos ..

Re: WinSock palīdzība

Posted: 07 Sep 2011, 19:37
by snake5
Tas taimeris nav atkarīgs no laika. Kā rezultātā neko daudz nedod (atkarīgs no procesora, vislabāk gan jau strādās uz pagājušās simtgades izstrādājumiem :D ). Vajag izmantot laika funkcijas, lai ierobežotu kadru (sūtījumu) skaitu sekundē.

Re: WinSock palīdzība

Posted: 09 Sep 2011, 00:15
by CodeWolf
mhm liekas ka atrisinaju problemu.. sizeof(char) vieta ieliku (int)strlen(char) un suutot datus nekas nebremze + dati tiek nosutiti... Tikai tagad radas cits jautajums
kā lai sadalu sūtamos objektus daļās? Piem Poziciju X nosutot ta nokļūs pie Pozicijas X?
meiģināju
salikt rindiņā .. ta lai nosutas pec kartas ..

Code: Select all

Serveri                                                            Klienta
send(player_pos untt.X..);                              reciv(player_pos ...x...
send(player_pos untt.Y..);                              reciv(player_pos ...y...
send(player_rot untt.Y.. );                              reciv(player_rot  ...y...
bet liekas ka brižiem kautkam nolagojot pie X pozicijas nokļuva rotacija :shock:
taka isti nav ideju.. ka pareizi sutit :|