[C/C++] Simpel server till textbaserat spel

Permalänk
Medlem

[C/C++] Simpel server till textbaserat spel

Tjena!
Nu håller jag på att bli galen så jag vänder mig till er.
Jag har en väldigt simpel server som man kan ansluta till och sedan skriva till och då kommer den "eka" tillbaka det man skrivit .
Men för att det ska funka ihop med ett spel som kan ha flera spelare sammtidigt har jag lagt servern i en tråd så att servern kan köras separat ifrån varje spelinstans. När jag kör servern i tråden så fungerar fortfarande allt som det ska.
Vad jag vill uppnå härnest är att varje gång en ny anslutning kommer in så ska det skapas en ny spelinstans, tråden för den ska startas och läggas in i en array.
När klienten sedan skickar ett meddelande till servern så är tanken att det ska skickas till just den spelarens spelinstans för behandling och sedan ska ett svar skickas till servern som skrivs ut på spelarens skärm. Detta är logiken som jag tror är rätt ok. Vad tror ni?

Mitt problem.
Jag försöker göra så att varje gång det kommer in en ny anslutning så ska det skapas ett spelobjekt och sedan för att testa så har jag i speltråden en funktion som bara sätter det privata meddelandet till "hej" så att när jag kör en getMsg från write() (funktionen som skriver ut på användarens skärm) så skrivs hej ut men sedan crashar servern pga segmenterings fel

GameHandler g1; while (true) { int i=0; this->readingSockets = this->openSockets; this->socketBind = select(getdtablesize(), &this->readingSockets, NULL, NULL, (struct timeval *)NULL); if (FD_ISSET(sD, &this->readingSockets)) { cD = accept(sD, (struct sockaddr *)&this->clientAdr,(socklen_t*) &this->sCadr); FD_SET(cD, &this->openSockets); g1.newGame(i)//#1 continue; } for (int i=0; i<getdtablesize(); i++) if (i != sD && FD_ISSET(i, &this->readingSockets)) { this->socketBind = read(i, this->buf, buffer); if (this->socketBind == 0) { close(i); FD_CLR(i, &this->openSockets); } else { //buf=msg; write(i,g1.getMsg(i), this->socketBind); } }

Detta är en liten del av gameHandlern

void newGame(int id) { this->gamez[this->nrOfgames++]=new Game(id); } void setMsg(int i,char *buf) { this->gamez[i]->setMsg(buf); } const char* getMsg(int index) { return this->gamez[index]->getMsg(); }

Och slutligen en del av spelet.

Game(int ID) { pthread_create(&t1, NULL, &Game::start_Help, this); this->gameID=ID; //pthread_join(t1, NULL); När denna är bortkommenterad så får jag utskriften hej och sedan krash om den inte är det så kraschar det inte men jag får ingen utskrift } const char* getMsg(); void setMsg(char*); void* startGame(void ) { while(true) { char msg[]="hej"; cast(msg); } } static void *start_Help(void*s) { return ((Game*)s)->startGame(); }

Jag hoppas det finns någon som som har orken att gå igenom min "wall of text".
Tack på förhand !

Permalänk
Medlem

Du har inte trådsäkrat dina lokala anrop.
Att skriva asynkrona serverprogram är mycket mer komplext än man skulle kunna tro. Googla på "Safe threading" för att lära dig om vad som är ditt problem och hur man löser det (Kräver mer förklaringar än jag pallar skriva tyvärr.)