/** ****************************************************************************** @file /net/client.h @brief Trida klienta @author Vta @version 1.0 ******************************************************************************/ #ifndef _CLIENT_ #define _CLIENT_ #include "net/comm.h" namespace net { /** Funkce spoustena ve vlastnim vlakne prijimajici zpravy od klienta */ int recvClient_thread(void * data); /** Funkce spoustena ve vlastnim vlakne odesilajici ping */ int pingClient_thread(void * data); /// Trida sitoveho klienta class TClient:public TComm { public: /** Vrati cislo portu, na kterem data odesila */ int getPort(); /** Zahaji cinnost, connectto udavat kam se ma klient pripojit, jmeno serveru muze mit nejvyse 127 znaku */ int prepare(char * connectto); /** Pripravi data k odeslani (zaradi do fronty) */ int sendMessage(TXMLdata * data); /** Spojeni se serverem se zavrelo (this->fd se zavrel), nastaveni do stavu nepripojen */ void socketWasClosed(); /** Konstruktor s informaci, zda je klient lokalni nebo sitovy */ TClient(int localGame,int port,char * profile_name); /** Destruktor. Ceka az skonci vsechna vlakna, ktere klient pustil */ ~TClient(); /** Ziska - prekopiruje jmeno profilu */ void getMyProfileName(char profile_name[K8_MAX_NAME_LEN]); /** Prida si zaznam o nove pripojenem klientu */ void addClientInfo(TNodeInfo * client); /** Odebere zaznam o odpojenem klientu */ void removeClientInfo(int clientid); /** Prekopiruje informace o ucastnicich v siti */ void copyClientsInfo(TClientsInfo * ci); /** Nastavi hodnotu sveho clientid */ void setMyClientId(int clientid); /** Ziska hodnotu sveho clientid */ int getMyClientId(); /** Zacne posilat ping */ void startPing(); /** Upravi cas posledniho prichodu ping */ void setPing(); private: /** Naplni strukturu hostent */ int findServer(char * ip); /** Socketaddr klienta */ struct sockaddr_in client; /** Pripoji se na server */ int connectToServer(); /** Jmeno serveru */ struct hostent *he; /** Zdali je pripojen */ int connected; /** Funkce bezici ve vlakne prijimajici data od klienta */ friend int recvClient_thread(void * data); /** Funkce pripojujici ve vlakne klienta k serveru */ friend int connectToServer_thread(void * data); /** Funkce na hledani okolnich her */ friend int searchGame_thread(void * data); /** Funkce odesilajici pingy */ friend int pingClient_thread(void * data); /** Id vlakna, ktere prijima data od serveru */ SDL_Thread * recvThread; /** Id vlakna, ktere odesila ping */ SDL_Thread * pingThread; /** Buffer na prijimani vetsich zprav */ DA * recvbuff; /** Buffer na prijimani vetsich zprav */ DA * decompressbuff; /** Adresa serveru */ char address[128]; /** Jmeno profilu, ktery tento klient zastava */ char profile_name[K8_MAX_NAME_LEN]; /** Informace o klientech ve hre */ DA * clients_info; /** Hodnota meho clientId */ int my_clientid; /** Velikost pristi zpravy */ int size_of_next_message; /** Cas prijmuti posledniho pingu */ int last_ping_received; /** Pomocny semafor pri cekani na vytvoreni vlakna */ SDL_sem *sem2; /** Pomocny semafor pri cekani na vytvoreni vlakna */ SDL_sem *sem3; }; } #endif