Hmm..
also das läuft so, jede Connection hat eine Handlenummer die kannst du mit dem Befehl socket.Connections[socket.ActiveConnections-1].Handle ermitteln.
Somit kannst du jede aktive Verbindung über diese Nummer eindeutig identifizieren.
Beispiel:
Client Nr.1 hat socket.ActiveConnections-1; also 0 mit der Handlenummer zb. 1255
Client Nr.2 hat socket.ActiveConnections-1; also 1 mit der Handlenummer zb. 1599
...
usw.
Speicher also zu jeder Verbindung das
Handle ab: Stichwort Array oder Record.
Wenn ein Client offline geht wird das Ereignis
ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); ausgelöst.
Sender:: TCustomWinSocket ist so freudlich und teilt dir die Handlenummer mit, die gerade offline gegangen ist. Über eine Schleife kannst du nun Ermitteln welches
Handle zu welcher Verbindung paßt und diese, dann nicht mehr nutzen.
Bissel Code aus einem alten Projekt von mir.
Delphi-Quellcode:
//Clienten aus Liste löschen bei Event ClientonDisconnect funktionsfähig
procedure TNet7Server.ClientDeleteList(DSocket: TCustomWinSocket);
(* -------------------------------------------------------------------------- *)
var
i: Integer;
i2: integer;
i3: integer;
HDL: Integer;
z: integer;
begin
z := 0;
for i := 0 to MaxAnzCon do
begin
if cv.HNr[i] = dsocket.Handle then
begin
//wenn es die höchste Verbindungsnummer ist ,brauchen die anderen nicht angepasst werden
if (cv.Con[i] = socket.ActiveConnections-1) then
begin
debuglog('Gleich wird exit ausgelöst',-1,173);
cv.Con[i] := -1;
cv.HNr[i] := -1;
cv.isOnline[i] := false;
ClientListNow;
exit; // Und raus
end;
// z:=i;
i3 := cv.Con[i]; //merke deine Connummer damit nur die verkleinert werden die grösser sind als du
cv.Con[i] := -1;
cv.HNr[i] := -1;
cv.isOnline[i] := false;
{ Connections den Handles anpassen, ab der cons
die aufgelöst wurde müssen die anderen cons die dahinter u Gr. sind um -1 aufrücken
[0][1][2][3][x]<-- war mal con 4 [4][5][6]
}
for i2 := 0 to MaxAnzCon do
begin
//nur die verkleinern die gr als gelöschte con
if (cv.Con[i2] >= 0) and (cv.Con[i2] > i3) then
begin
cv.Con[i2] := cv.Con[i2] -1;
end;
end;
end;
end;
ClientListNow;
end;
Ich hoffe das es im Groben und Ganzen alles erläutert. cv ist ein Record wo ich alle Daten der Verbindung abspeichere.
Mfg Net7