SDL_net Problem: Speicher korruption
-
Ich bin gerade dabei in mein Spiel einen Netzwerkmodus ein zu bauen.
Jetzt gibt es allerdings ein merkwürdiges Problem und ich finde den Fehler nicht.Ich benutze den UDP "Modus"... und mache alles was mit senden und empfangen zu tun hat wie hier http://gpwiki.org/index.php/SDL:Tutorial:Using_SDL_net#Using_UDP mit dem Unterschied, dass ich das in eine Klasse gepackt habe....
Wenn ich den Server starte läuft alles normal und funktioniert...
wenn ich dann mit dem Client connecte werden kurz alle nötigen Daten ausgetauscht und wenn der Vorgang abgeschlossen ist stürzt der Server ab.
Ich hab dann rausgefunden das es daran liegt das auf einmal alle möglichen(scheinbar "wahllos") Variablen im arsch sind... also ich nicht mehr richtig drauf zu greifen kann. Das doofe ist allerdings das ich während des connectens garnichts damit mache ! Ich füge lediglich ein "Schiff" hinzu und erstelle ein paar Nachrichten mit Hilfe von "sprintf" und einem ganz normalen char array...Interessant ist auch das beim Clienten alles normal weiter läuft... dabei unterscheiden sich Client und Server nur in unwichtigen Dingen (Client enthält Server Adresse, Server enthält Vector mit Client Addressen)
Code zu posten ist ein bischen schwierig weil er
1. an den entscheidenden stellen sehr undurchsichtig ist
2. über mehrere Teile verteilt ist...Also ich erwarte jetzt nicht von euch das ihr erratet wo genau mein Problem liegt ... aber vieleicht könnt ihr mir ja sagen wie ich diesen Fehler am besten finde ? Vieleicht gibt es ja bei der Verwendung von SDL_net irgendwas zu beachten was ich vergessen hab?
-
Der char array hört sich verdächtig an.
Überprüfst du ob der puffer großgenug ist?
Also ob für deine Daten genug Platz in dem array ist,
wenn da zuwenig platz ist wird der speicher hinter dem array überschrieben.So würd ich mir das erklären, mit SDL_net hatte ich bisher keine Probleme.
Ansonsten benutzt einen debugger und schau ab wann sich die Werte der Variabeln
scheinbar sinnlos verändern.Viel Glück

-
Mortal2006 schrieb:
... Ich füge lediglich ein "Schiff" hinzu ...
Wie sich jetzt herrausgestellt hat, ist genau das mein Problem

Ich checks trotzdem nicht
Also beim start des Spiels Schiffe zu erstellen scheint kein Problem zu sein.
Ich mach folgendes:
Ich erstelle mit der Funktion AddShip(x,y,angle) Schiffe...AddShip(randx,randy,rand()%360);Die Schiffe werden dabei in einen Vector gepackt. Das erste Schiff wird dann "meins"
usershipnumber=Ships[0].number; UserShip=&Ships[0];Die Funktion zum hinzufügen sieht so aus:
void CGame::AddShip(double x, double y, double angle) { CShip Add; Add.number=shipnumber; shipnumber++; Add.angle=angle; Add.x=x; Add.y=y; Add.z=0; Add.power=0; Add.maxspeed=26; Add.speed=0; Add.speedx=0; Add.speedy=0; Add.width=64; Add.height=425; Add.steerangle=0; Add.health=100; Add.healthbridge=100; Add.healthfeuerleith=100; Add.healthfeuerleitv=100; Add.healthmachine=100; CTower AddT; AddT.x=33; AddT.y=92; AddT.ammo=130; AddT.autofire=false; AddT.lastshot=0; AddT.interval=2000; //25000 AddT.health=100; AddT.roundx=0; AddT.roundy=-40; AddT.maxangle=105; AddT.anglez=30; AddT.angle=0; AddT.startangle=0; Add.Tower.push_back(AddT); // 33, 94 AddT.y=122; Add.Tower.push_back(AddT); // 33, 125 AddT.x=33; AddT.y=342; AddT.startangle=180; AddT.angle=180; AddT.roundy=38; Add.Tower.push_back(AddT); //33, 342 AddT.y=311; Add.Tower.push_back(AddT); // 33, 311 Add.LoadCollisionList(); Ships.push_back(Add); }Wenn ich das mittem im Spiel aufrufe macht er voll Terror ? Versteh ich nicht!
Ich mach doch garnichts schlimmes oder ?
Bitte helft mir ... ich weiß nicht ob ich heute nen brett vorm kopf hab oder so ... ich verstehs nicht
-
ich kenn dein klassendesign natürlich nicht,
und auch die funktionen die du aufrufst kenn ich nicht.aber vll. solltest du CShip Add; lieber im freispeicher anlegen (also mit new).
Den so ist es ja nur local.Ist aber natürlich nur geraten, weis ja nicht wie du das in den funktionen verwendest.
-
Hmm jo hast recht!
Problem war das wenn ich ein element hinzufüge der Pointer auf Ships[0] ungültig wird. Wenn ich anstatt des CShip Vectors nen CShip* Vector genommen hätte, hätte ich das Problem nicht gehabt.
Hatte sowas schon vermutet und versucht das "nach zu stellen"... da ist das aber nicht aufgetreten... naja das "Netzwerk" funzt jetzt
Danke für deine Hilfe!
