[Problem] RPG-Server Programmierung unter Linux
-
man kann auf .c_str() auch zugreifen?
edit: tatsache. nun ich hab jezt aus send ein string gemacht. jedoch bekomm ich den fehler immer noch beim 2 mal
-
Äh, aber den String dann auch nicht per sprintf beschreiben, gell? Da kannst Du dann eleganter (und richtiger) mit + machen (bei größeren Mengen evtl. mit Streams). Im Zweifel zeig nochmal den Code von handleClient, wie er jetzt ist
string send = "You send me " + receive + "\n";
-
nein. es kommt mir so vor als würde send bzw recieve in beiden threads auf der selben speicherstelle basieren.
hier noch mal handleClient:
void *handleClient ( void *ptr ) { int sock = ( int ) ( int * ) ptr; string receive = ""; string send; while ( receive != "quit" ) { receive = recv_ex ( sock ); receive = stripRN(receive); send = "You send me '"+recieve+"'\n" send_ex ( sock,send.c_str() ); } close(sock); }
-
hatte noch keiner von euch ein ähnliches problem? oder hatte bei der serverprogrammierung mit pthreads einen weg eingeschlagen der ohne diesen fehler verlief? egal ob windows oder linux.
-
madmaurice schrieb:
hatte noch keiner von euch ein ähnliches problem? oder hatte bei der serverprogrammierung mit pthreads einen weg eingeschlagen der ohne diesen fehler verlief? egal ob windows oder linux.
man sollte nicht threads nehmen, sondern lieber select() und ähnliches.
-
deine threads lauschen alle am selben socket. das muss nicht verkehrt sein, sorgt aber u.u. für probleme. da über den socket auch steuerinformationen kommen, die neue threads erzeugen, würd ich die gesamte netzwerkkommunikation in einen einzigen thread auslagern. dieser kann dann die empfangenen daten filtern und den entsprechenden reveivern zuweisen.
-
@joomoo habe von select noch nicht gehört werde aber mal danach googeln
@thordk falsch. meine threads lauschen gar nicht. sie bekommen alle ein eigenes socket (den int wert den accept() zurückgibt) zugewiesen. dieser int wert wird per parameter an den thread übergeben.
-
Nur mal nebenbei:
char buf[BUFSIZE]; ... return (std::string)buf;
Das ist doch nicht valid?!
-
ich habe das nach einem thread in einem forum gemacht.
dort wird gesagt man soll das folgendermaßen machen:
char buf[]; string string1(buf);
also müsste das auch mit
(string)buf
gehen oder?
Hast du eine bessere Idee Kenny?
-
madmaurice schrieb:
ich habe das nach einem thread in einem forum gemacht.
dort wird gesagt man soll das folgendermaßen machen:
char buf[]; string string1(buf);
also müsste das auch mit
(string)buf
gehen oder?
Hast du eine bessere Idee Kenny?
Das eine ist ein Konstruktoraufruf, und das andere ein C-Style-Cast.
Man sollte in C++ möglichgst static_cast, reinterpret_cast etc. nutzen.
char buf[]; ... return std::string(buf);
Sollte das sein, was du suchst.
(Erzeugt ein temporäres String-Objekt mit dem Inhalt von buf und gibt dies zurück)
-
@kenny
habs geändert.jedoch löst das problem damit nicht.
@joomoo
ich finde leider keine tutorial bzw eine referenz die auf select() hinweißt.hast du da einen link?
-
-
ich blick in diesem select() nicht durch.
gibt es keinen weg das mit pthreads zu lösen?
-
doch, aber der ist scheiße
-
wenn ich richtig verstehe ist select() eine möglichkeit zu schauen ob eine neuer client connecten will bzw daten gesendet hat!?
-
ich blick einfach nich durch. also wie is denn dieser weg mit threads?
egal ob der scheiße ist oder nicht
-
der weg "mit threads" ist: du machst für jeden client der connected ist einen eigenen thread. das schöne daran ist dass du in dem thread mit blocking IO arbeiten kannst, was die sache viel einfacher macht. der nachtei ist dass es ein resourcen-fresser ist (threads sind i.a. recht "teuer").
-
das hab ich doch am anfang probiert!?
hab jedoch diesen blöden speicherzugriffsfehler bekommen!