JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=c4dd865c4967a667e11a0e09c21e9549Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

SDLNet und verkettete Listen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
DaGeRe
Mini JLI'ler



Anmeldedatum: 08.08.2007
Beiträge: 7
Wohnort: Leipzig
Medaillen: Keine

BeitragVerfasst am: 29.08.2007, 10:36    Titel: SDLNet und verkettete Listen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 29.08.2007, 11:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DaGeRe
Mini JLI'ler



Anmeldedatum: 08.08.2007
Beiträge: 7
Wohnort: Leipzig
Medaillen: Keine

BeitragVerfasst am: 29.08.2007, 14:56    Titel: Antworten mit Zitat

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 Sad 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum