DirectPlay-Beenden (Client/Server)



  • Beim Beenden einer Client/Server-Verbindung habe ich derbe Probleme.
    Wird der Server beendet, schickt er eine asynchrone Meldung an alle Client, der diese veranlasst ebenfalls das Spiel zu beenden.

    Der Client führt dabei Folgendes aus:

    DWORD anz;
    
    if(client){
       do{
          client->GetSendQueueInfo(&anz, NULL, 0);
       }while(anz);
       client->Close(0);
       client->Release();
       client = NULL;
    }
    

    Sobald er bei client->Release(); angekommen ist, tut sich nichts mehr (weder beim Server noch beim Client).

    Ist diese Zeile auskommentiert, kehren sowohl Server als auch Client erfolgreich ins Menü zurück.

    Weiss jemand, wo das Problem zu suchen ist? Ich sitze jetzt seit Stunden dran und finde den Fehler einfach nicht.

    [Edit]Noch was vergessen:
    client wird so initialisiert:

    CoCreateInstance(CLSID_DirectPlay8Client, NULL, CLSCTX_INPROC, IID_IDirectPlay8Client, (LPVOID*)&client);
    client->Initialize(0, client_messagehandler, 0);
    

    [ Dieser Beitrag wurde am 18.01.2003 um 23:40 Uhr von Luke1410 editiert. ]



  • ist es nicht normal wenn der Server beendet wird, dass auch die Clients beendet werden? Immerhin connecten die Clients zum Server. Ohne Server läuft da nix mehr.



  • Automatisch die Verbindung trennen sollten sie schon, aber das Client-COM-Objekt wird ja nicht freigegeben, nur weil die Verbindung getrennt ist.

    Ich denke, dass ich jetzt aber den Fehler gefunden habe.

    Die Funktion StopClient(); wurde im Messagehandler des Clients aufgerufen, sobald er die Meldung vom Server empfangen hatte, dass das Spiel beendet ist.
    Allerdings war er bei dem Aufruf auf Stackebene praktisch noch im Messagehandler, der mit dem COM-Objekt des Clients verknüpft war. Somit hat er versucht sich selbst zu beenden, weswegen es wohl zu den ganzen komischen Fehlern und Abstürzen gekommen ist.

    Ich habe dass jetzt so gelöst, dass, sobald der Clienz die Ende-Message erhalten hat, er mit PostMessage eine Nachricht an die Hauptfunktion schickt und erst dort im Messagehandler des Main-Windows ClientStop(); aufgerufen wird.

    So hat jetzt zumindest das Beenden des Servers und das des Clients, wenn dieser sich selbst beendet, funktioniert. Nur beim Empfangen der Nachricht gibt es wohl noch ein Problem, das sich aber hoffentlich bald lösen wird. 🙂

    Auf jeden Fall danke für deine Antwort. 🙂


Anmelden zum Antworten