Autor Beitrag
Cheatzs
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 30.08.03 16:23 
Hi Leutz,
ich hab ein großes Problem!
Also ich hab einen Server geschrieben ( mit TServerSocket ) auf denen sich viele Clientprogramme( mit TClientSocket ) anmelden ( immer von der selber Art, bloß ungefär 10 stück ).
Sie bauen also eine Verbindung mit dem Server auf und schicken eine Nachricht mit allen nötigen Infos(z.B. Name, Ip, ...) an den Server der sie dann in einen dynamischen Array eines Records einträgt, und damit verwaltet.
Bei dieser ganzen Verwaltungsgeschichte soll die ID des Arrays immer mit der ID der jeweiligen Verbindung am Server übereinstimmen. Sonst wüsste der Server ja garnicht, wo er die Daten (Name, Ip,...) hinordnen sollte.

Mein Problem ist nun, wenn der Client einfach so z.B. Abstürtzt(durch Win Taskmanager) oder man das Kabel zieht, kann sich der Client nicht mehr ordnungsgemäß abmelden. Das führt dazu, dass die ID's im Dyn. Array und bei den Connections nicht mehr übereinstimmen.

Um dieses Problem zu lösen, habe ich schon folgendes versucht:
Beim OnError-Event vom Tserversocket eine Prozedur aufgerufen, die an alle bestehenden Verbindungen eine Nachricht schickt, dass sich die Clients melden sollen. So kann ich herrausfinden, wer sich nicht melden und diesen dann abmelden.
Theoretisch müsste es gehen. Das Problem bei dieser Lösung ist nur das beim Ausführen der Prozedur, bei der an alle eine Nachricht geschickt wird, die Anzahl der ActivConnections nicht mit der tatsächlichen Anzahl übereinstimmt.
Dass heisst. z.B.
3 Clients sind angemeldet. Man lässt einen killen. OnError wird aufgerufen.
ActiveConnections ist trotzdem noch 3!!!

Will man nun an alle 3 Connections eine Nachricht schicken, kommt es bei einer zum Fehler, weil diese ja eigentlich nicht mehr besteht. Auch die Connected Variable der eigentlich getrennten Verbindung ist noch auf True gestellt.

Lange Rede kurzer Sinn.
Kennt ihr eine funktionierende Möglichkeit, herrauszufinden, welche Verbindung bei einem Absturtz, oder Kabelrausziehen flöten geht?

Würde mich um Antworten freuen, versuche es schon 3 Tage.

THX
FeG
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 77

Win XP Home, SuSE Linux 8.2 Prof
D3 Prof, D7 Prof
BeitragVerfasst: Sa 30.08.03 17:10 
Hi,
Cheatzs hat folgendes geschrieben:
Will man nun an alle 3 Connections eine Nachricht schicken, kommt es bei einer zum Fehler, weil diese ja eigentlich nicht mehr besteht.

Und genau DEN Fehler musst du ausnutzen (mit try...except). Im Except-Teil löschst du dann den fehlerhaften, also nicht mehr existierenden Client aus der Liste...

MfG,
FeG
Cheatzs Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 30.08.03 17:24 
Danke, darauf wär ich nich gekommen!
Aber es klappt noch nicht, wenn sich z.B. nur 2 Clients verbunden haben, dann kommt die Meldung nämlich nicht, nur bei vielen Clients. Aber das kann ich ja dann mit der alten Variante lösen!

Thx