PDA

Prikaži potpunu verziju : Server and Client problem


clzola
20.1.2011, 22:17
Jezik C/C++. Linux Ubuntu 10.10
Pokusavam da napravim Server i Client. Na jedan server se mogu konektovati najvise 4 klienta. E sad, uspijem da napravim Server koji ce da primi nick od svakog klienta i zatim svakom klientu da posalje te nikove.

Medjutim nailazim na problem kada treba da ova 4 clienta medjusobno komuniciraju.

Server:
http://paste2.org/p/1202641
Client:
http://paste2.org/p/1202642

Kada upalim server povezem ova 4 klienta na server i kada treba da se razmeni poruka izmedju klienata desi se sledece

1. Client
-posalje poruku OK!
- primi poruku OK!
- primi poruku OK
- error in recv (kada treba da primi od 4 klienta)

2. Client
- posalje poruku OK!
- primi poruku OK
- primi poruku OK
- primi poruku OK
- greska u primanju poruke recv

3. Client
- posalje OK
- primi OK
- primi OK
- primi OK
- Exit OK

4. Client isto kao treci :////
Sad ne kapiram gdje grijesim sa kodom...
napravio sam u clientu
while perlju kod koje ako je tvoj Index onda salji, ako nije onda primas, a svoj index dobijas kada se konektujes na server


/*
Index je na pocetku 1, znaci da je na redu client 1. Client 1 provjerava da li je njegov Index jednak trenutnom Indexu i onda u
odnosu na to salje. Drugi klient provjerava da li je njegov Index jednak jedinici, kako se drugi klient povezao kao 2. na server on je
dobio index 2 i smjesten je u variablu yourIndex prema tome on ce da ceka poruku koja ce biti poslata od client 1.
I sada kada primi poruku client 2, opet provjerava Index == yourIndex,
kako se Index uvecao za jedan on isnozi 2 i sada Client2 salje poruku...
Tako i ostali clienti
*/
while(Index < 5) // da predje sva 4 klienta
{
if(Index == yourIndex) { send(); }
else { recv(); }
Index++;
}


Kasnije cu da pokusam da ovaj klient ubacim u igricu koju radim... (Zato mi ovo treba).Nije toliko veliki prioritet da bas sve shvatim oko Internet programiranja. Zelim samo da zavrsim igru koju sam poceo da radim (imam preveliku zelju da je napravim). Kopirao sam kod servera i clienta iz tutoriala, i samo mijenjam ovo za recv i send, to jeste samo pravim petlje i odredjujem kada sta treba da se salje...

Help ...

mctoxic88
21.1.2011, 15:16
Pff, hm, trebao si mozda ovo da odradis u C++ preko klasa i automata. Jer bi onda mogao da definises stanja u koje ulaze klijenti pri pristupanju serveru ;)

clzola
21.1.2011, 23:52
Ubacio sam prije ove while petlje scanf funkciju kojom upisem sta treba da se posalje ostalim klientima.
I posto sam to uradio, nekim cudom je ovo proradilo :D i sad radi OK... :/

clzola
22.1.2011, 15:13
Da ne otvaram novu temu....

Programiram na Linuxu i pravim jednu igricu. Igrica treba da radi preko neta, tako da koristim header fajlove za sokete i povezivanja itd itd... Sad da li mogu iste te hedere da koristim i u Windows-u, da ne bih pisao posebno za windows sa winsockom .... :/

Fantastic
23.1.2011, 11:44
Da ne otvaram novu temu....

Programiram na Linuxu i pravim jednu igricu. Igrica treba da radi preko neta, tako da koristim header fajlove za sokete i povezivanja itd itd... Sad da li mogu iste te hedere da koristim i u Windows-u, da ne bih pisao posebno za windows sa winsockom .... :/

zavisi od headera
ali pazi ti win headere ne mozes ni u linux
probaj u linuxu koristiti windows.h
znaci da vecina nece moci

Geomaster
25.1.2011, 15:15
Da ne otvaram novu temu....

Programiram na Linuxu i pravim jednu igricu. Igrica treba da radi preko neta, tako da koristim header fajlove za sokete i povezivanja itd itd... Sad da li mogu iste te hedere da koristim i u Windows-u, da ne bih pisao posebno za windows sa winsockom .... :/
Zavisi koji su headeri u pitanju. Ako su u pitanju headeri koji su u C++ standardu, onda su oni podržani na svim kompajlerima i operativnim sistemima. Ali u tvom slučaju, verovatno koristiš Berkeley sokete, dok na Windowsu moraš da radiš sa Winsockom, tako da ćeš morati kôd da ponovo napišeš za Windows. Moj savet je da napraviš neki abstraction layer tj. interfejs koji koristi Winsock ili neki drugi pristup u zavisnosti od operativnog sistema, ali ti iz tvog kôda pozivaš iste funkcije bez obzira na to koji se sistem koristi (kao wrapper oko socket kôda). I još jedna stvar, ako si slučajno koristio fork() kod server za handlovanje više konekcija, za to nema teoretske šanse u Windowsu bez petljanja sa nekim assembly-level stvarima, što nije ono što bi hteo da radiš, veruj mi :)

clzola
25.1.2011, 18:57
Nisam koristio fork u serveru... al hvala na odgovorima, mislim predpostavljao sam da nece moci par header-a ali eto cisto da pitam...

Igricu sam odradio na Linux, Klijent i Server i trenutno rade samo na mom kompu... Videcu dalje da probam da prosirim da moze u LAN pa u internet, a sto se tice Windows-a, snaci cu se nekako, mislim da se inicijalizacija i setup razlikuje dok je slanje i primanje isto (send() & recv()).

Pitanje:
Da li moze da se server upali na Linuxu, da se jedan od klijenta poveze sa Linux sistema a drugi klijenti da se povezu sa Windows sistema... ?

SS Igre:
http://img231.imageshack.us/f/screenshot2ipr.png/

Jedina je mana sto recv() komanda blokuju igricu, to jeste kada je vrijeme da klijent primi koordinate od drugog klijenta, ne moze se stisnuti Exit dugme ili Close dugme u titlebar-u.

Geomaster
25.1.2011, 23:56
Nisam koristio fork u serveru... al hvala na odgovorima, mislim predpostavljao sam da nece moci par header-a ali eto cisto da pitam...

Igricu sam odradio na Linux, Klijent i Server i trenutno rade samo na mom kompu... Videcu dalje da probam da prosirim da moze u LAN pa u internet, a sto se tice Windows-a, snaci cu se nekako, mislim da se inicijalizacija i setup razlikuje dok je slanje i primanje isto (send() & recv()).

Pitanje:
Da li moze da se server upali na Linuxu, da se jedan od klijenta poveze sa Linux sistema a drugi klijenti da se povezu sa Windows sistema... ?

SS Igre:
http://img231.imageshack.us/f/screenshot2ipr.png/

Jedina je mana sto recv() komanda blokuju igricu, to jeste kada je vrijeme da klijent primi koordinate od drugog klijenta, ne moze se stisnuti Exit dugme ili Close dugme u titlebar-u.
Ako imaš klijent koji radi pod Windowsom, moći će da se konektuje na bilo koju vrstu servera. Serveri rade na socketu, tako da je sasvim nebitno pod kojim operativnim sistemom su (isto kao što ti možeš da pristupiš Apache serveru preko Win-a).

Davno sam radio sa socketima u Win-u, ali koliko se sećam socket je kao random-access fajl sa kog možeš da čitaš i u koji možeš da pišeš.

To što recv blokuje igru može da se reši samo multithreadingom, ali onda moraš da paziš na sinhronizaciju. Meni je u mom frameworku trebalo dve neprospavane noći da sredim sve mutexe među 50+ različitih objekta od kojih svako može da spawnuje thread i accessuje neki drugi objekat... Kod tebe je to nešto manjih razmera, tj. jedan thread bi radio message pump i rendao u framebuffer a drugi se bavio logikom i send&receive (ako hoćeš, može da bude i jedan za sâmu logiku a jedan za komunikaciju, u suštini kako ti odgovara).