Zitat von
Net7:
Ähm.. also nun frag ich mich ernsthaft was an meiner Lösung ( weiter oben )so umsändlich sein soll.
Ich bezog mich auf Real_Thunder, aber ich kann auch gerne zu deiner Lösung nochmal noch ein paar Aussagen treffen:
1. Durch MaxAnzCon ist deine Logik/Verwaltung auf 100 Clients begrenzt und nicht dynamisch erweiterbar.
2. Warum, besser, wofür merkst du dir das Sockethandle? Wozu brauchst du dieses in der Clientverwaltung da du doch alles mit den Instanzen der TCustomWinSockets erledigst (bzw. deren Methoden)
3. Was nützt dir ein "Online" Flag, wenn es doch einfach festzustellen geht: Wenn ein Socket vorhanden ist, ist er online, ist er nicht mehr vorhanden, dann ist er offline. Egal ob nun im Connections[] Array des Server Sockets oder sonstwo vermerkt.
4. Deine Eigenschaft "Con" ist nicht eindeutig, sie kann mehrfach vergeben werden bzw. wird mehrfach vergeben. Wozu brauchst du diese dann? Wozu dient diese Eigenschaft?
Vor allem frage ich mich, was dir diese Verwaltung bringt? Im Normallfall ist das Problem doch die Zuordnung von zusätzlichen Daten den Sockets und nicht zu wissen welche Sockets zZ am Server hängen. Letzteres kann man einfach und sofort durch Iteration der Connections[] Eigenschaft ermitteln.
Wenn ich zusätzliche Informationen verwalten will (ist der Client authentifiziert, welcher Client (z.B. Name) ist das, etc), dann würde ich eine Klasse erstellen welche in einer TObjectList verwaltet wird. Diese Klasse bekommt eine Eigenschaft oder öffentliche Variable vom Typ TCustomWinSocket und lebt genauso lange wie der Socket zu der sie gehört. Alle zusätzlichen Informationen die ich zu den Clients verwalten will bzw. speichern will, werden darin vermerkt. Beim Connect wird die Instanz der Klasse erstellt, der Objectlist zugefügt und der Eigenschaft Data des Sockets. Die Instanz bekommt auch den Socket zugewiesen auf die Eigenschaft.
Folgende zwei Beispielfälle:
- Ein Client disconnected: ok, ich hole mir die Instanz aus der Data Eigenschaft des Sockets, entferne diese aus der Objektliste und gebe sie frei (wenn nicht schon von der TObjectList abhängig von OwnsObject schon getan).
- Ich will eine Nachricht an alle authentifizierten Clients schicken: Ich laufe über alle Elemente der Objektliste und für jedes Element welches authentifiziert ist, sende ich eine Nachricht direkt durch Aufruf der SendText() Methode der vermerkten Socket Instanz - ohne vorher das Connections[] Array für jedes Element abzuklappern.
Ich für meinen Teil würde das dann noch weiter spinnen und keine TObjectList nutzen sondern eine Ableitung von dieser implementieren, welche dadurch besondere Methoden bekommen kann. So z.B. eine Methode der Liste für SendToAll(), etc.