|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DaGeRe Mini JLI'ler
Anmeldedatum: 08.08.2007 Beiträge: 7 Wohnort: Leipzig Medaillen: Keine
|
Verfasst am: 29.08.2007, 10:36 Titel: SDLNet und verkettete Listen |
|
|
Hallo,
Ich habe ein Problem mit SDLNet(hoffe, das gehört in dieses Unterforum)
Ich will für ein Spiel Befehle übertragen, und zwar solche Datensätze:
CPP: | struct befehl
{
list<int> betroffeneRS;
int xziel, yziel;
int zeitschritt;
};
|
Und zwar habe ich folgende Funktionen zum senden und empfangen(Verbinden klappt bereits):
CPP: | bool ress::empfang(befehl *daten)
{
if ( SDLNet_CheckSockets( sockets, 1 ) )
{
cout<<"Empfang!"<<endl;
SDLNet_TCP_Recv( verbindung, daten, sizeof(befehl) );
cout<<"lebe!"<<endl;
return true;
}
else
return false;
}
void ress::senden(befehl *daten)
{
cout<<"Sende!"<<endl;
SDLNet_TCP_Send( verbindung, daten, sizeof(befehl) );
}
|
Nun versuche ich in meiner Hauptschleife, wenn geklickt wird / wenn etwas empfangen wird, die Daten zu verwerten:
CPP: | [...]
if ( *maus[1] )
{
temp.zeitschritt = t + 50;
temp.betroffeneRS = angeklickt;
temp.xziel = x;temp.yziel = y;
R->senden( &temp );
befehle.push_back( temp );
cout<<"LebeNachSenden"<<endl;
}
if ( R->empfang( &temp ) )
{
befehle.push_back( temp );
cout<<"LebeNachEmpfang"<<endl;
}
[...]
|
Leider stürzt das ganze hier ab(manchmal bei dem der sendet, manchmal beim anderen, das ist unterschiedlich)
Wenn ich jedoch befehle.push_back in beiden Fällen ausklammere, und temp.betroffeneRS=angeklickt, dann funktioniert es.
Ich vermute ja, dass da irgendwas mit den Listen nicht stimmt(da sollten ja Pointer auf die Nachfolgeelemente übertragen werden, aber die Addressen sind natürlich beim anderen Computer anders...außerdem ist die Liste ja immer unterschiedlich groß, kann da sizeof(befehl) überhaupt gehen?)
Hat jemand eine Ahnung, ob es daran bzw. woran es liegt, und wie man es beheben könnte? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 29.08.2007, 11:34 Titel: |
|
|
DU hast das Problem schon ganz gut erkannt.
Das Senden und empfangen geschieht auf Bytebasis. Es werden nur die Adressen in den Zeigern kopiert, nicht das, worauf sie zeigen.
Dafür gibt es natürlich eine Lösung, aber sie ist etwas umständlicher. Im Prinzip das selbe, wie wenn man eine Liste in eine Datei speichern will. Man schickt erst die Länge der Liste (Anzahl der Elemente als int oder so) und dann jedes einzelne Element separat. Beim Empfangen nimmt man nun Element für Element und fügt es in eine neue Liste ein.
Evtl. empfiehlt es sich, vor dem Senden eine Klasse zu benutzen, um alle Daten des Befehls in einen Speicherblock hintereinander zu schreiben. Diesen kann man dann als einen Block verschicken, den wenn die einzelnen Objekte der Liste nicht direkt hintereinander im Speicher liegen (wovon man nicht ausgehen sollte) müsstest du sonst wahrscheinlich jedes Element einzeln verschicken. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DaGeRe Mini JLI'ler
Anmeldedatum: 08.08.2007 Beiträge: 7 Wohnort: Leipzig Medaillen: Keine
|
Verfasst am: 29.08.2007, 14:56 Titel: |
|
|
Die einfachste Lösung wäre also folgende:
CPP: | bool ress::empfang(befehl *daten)
{
if ( SDLNet_CheckSockets( sockets, 1 ) )
{
cout<<"Empfang!"<<endl;
int laenge;
SDLNet_TCP_Recv( verbindung, &laenge, sizeof(int) );
SDLNet_TCP_Recv( verbindung, daten, laenge );
cout<<"lebe!"<<endl;
return true;
}
else
return false;
}
void ress::senden(befehl *daten)
{
cout<<"Sende!"<<endl;
SDLNet_TCP_Send( verbindung, sizeof(daten), sizeof(int) );
SDLNet_TCP_Send( verbindung, daten, sizeof(befehl) );
}
|
Probier ich sofort aus..
/EDIT: So einfach wars leider nicht Es stürzt jetzt immer der Empfänger ab, nachdem ich gesendet hab...
/EDIT2: Seltsam...
Es stürzt zwar immer ziemlich genau beim Senden ab, aber in der stdout.txt steht was anderes:
stdout.txt hat Folgendes geschrieben: |
[...]Empfang!
lebe!
LebeNachEmpfang
Empfang!
lebe!
LebeNachEmpfang
[...]
|
Und erst, nachdem der, bei dem es abstürzt, x mal empfangen hat, stürzt das ganze ab...
Ich hätte jetzt erst getippt, das is so ähnlich wie wenn man nen char* übergibt, und dass R->empfang( &temp ); das temp nicht richtig kopiert, sondern dass danach nur noch ein Pointer auf die falsche Addresse in temp steht.
Hab aber jetzt rumprobiert, und auch wenn ich das befehle.push_back( temp ) danach auskommentiere stürzt er ab - es liegt also höchstewahrscheinlich nicht an der Auswertung, sondern an irgendwas beim Empfang (zumal die richtige Auswertung eh ausgeklammert ist..)
Aber was fällt mir leider absolut nicht ein - weiß vielleicht einer hier Rat? |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|