Einzelnen Beitrag anzeigen

Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#7

Re: TClientSocket / TSeverSocket --- Gruppenchat

  Alt 8. Mai 2008, 07:09
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
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat