000
17.03.2003, 21:47 Uhr
bIOHAZARd
|
Hi,
ich bastel gerade zur Übung ein kleines Chatprogramm Server/Client basiert. Der Server soll natürlich mehrere Verbindungen (=Chatter) zulassen.
Gedacht hab ich mir das so: Der Server hat einen "m_sListenSocket" auf dem er auf Verbindungen wartet. Möchte ein Client eine Verbindung aufbauen so wird zuerst eine Instanz meiner CClient Klasse erstellt (z.B.: newClient). Diese Klasse beinhaltet eine "m_sClientSocket" Membervariable, die den Socket für diesen Client darstellen soll. Ich akzeptiere die Verbindung dann mit m_sListenSocket.Accept(newClient->GetClientSocket()) was soweit auch wunderbar funktioniert. Anschließend wird das "newClient"-Objekt - samt dem als Membervariable gespeicherten Socket, in ein CObArray geschrieben.
Nun mein Problem: Wenn ich das Clientprogramm beende und somit clientseitig den Socket mit Close() schließe, reagiert der Server nicht darauf. Also die OnClose() Funktion wird auf der Serverseite für den aktuellen Socket nicht aufgerufen.
Ich mutmaße mal das es was mit der Tatsache zu tun hat, das der verbundene Socket als Membervariable eines Objekts, das sich in einem CObArray befindet, gespeichert ist. So dass der Client beim Beenden der Verbindung eventuell keine Gegenstelle findet um diese darüber zu informieren. Vielleicht ist das aber auch schwachsinn, keine ahnung ;P
Hat jemand Ahnung wie man soetwas löst? Irgendwelche Ideen?
Auf Wunsch zippe ich das ganze MS VC++ 6 Projekt und stells zum download zu verfügung, aber vielleicht reicht der obige Text ja schon damits bei jemanden hier klingelt
EDIT: Habe gerade folgendes bemerkt: Wenn ich mich als Client zum Server Verbinde wird beim Server korrekt die OnAccept Funktion aufgerufen, aber direkt danach auch die OnClose Funktion des Clients, also die Verbindung wird aufgebaut und unmittelbar danach wieder getrennt. Dieser Post wurde am 17.03.2003 um 22:21 Uhr von bIOHAZARd editiert. |