Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TCPserver Disconnect Problem (https://www.delphipraxis.net/59048-tcpserver-disconnect-problem.html)

th_bone 16. Dez 2005 15:56


TCPserver Disconnect Problem
 
Hi,

folgendes problem ich will die Clientliste bei jedem Client bei disconnect eines clients refreshen
klappt soweit auch, wenn ich die clients in der reihenfolge des connects wieder disconnecte

also connect 1,2 dann disconnect 2,1

ändere ich jetzt die Reihenfolge, des disconnect auf 1,2 (der zuerst eingeloggte Client loggt sich als erstes aus)
dann kriege ich eine EAccessViolation

ich hab den code auch schon mal mit den Chatdemos verglichen finde den Fehler aber leider nicht...

Danke

Ralf

hier die Problemstelle
Delphi-Quellcode:
procedure Tform1.BroadcastClientList;
var
  Count: Integer;
  List : TList;
begin
  List := tcpServer.Contexts.LockList;
    try
     for Count := 0 to ClientList.Count -1 do begin
      // hier wird die EAccessviolation ausgelöst      
      TIdContext(List.Items[Count]).Connection.iohandler.WriteLn(form1.lbClients.Items.CommaText);
      // hier wird die EAccessviolation ausgelöst
     end;
    except
    end;
  tcpServer.Contexts.UnlockList;
end;
und hier der code beim connect/disconnect
Delphi-Quellcode:
type
  // Speichert TCPclients
  TClient = class(TObject)
    Name    : String;
    No      : Integer;
    Thread  : Pointer;
  end;
//......

var
  Clientlist : TList;
//......

procedure TForm1.tcpServerConnect(AContext: TIdContext);
var
  Client : TClient;
begin
  Client := TClient.Create;
    Client.Name  := 'Logging In';
    Client.No    := lbClients.Items.Count;
    Client.Thread := AContext;
  AContext.Data := Client;

  Clientlist.Add(Client);
end;
//....

procedure TForm1.tcpServerDisconnect(AContext: TIdContext);
var
  Client : TClient;
begin
  Client := Pointer(AContext.Data);

  Clientlist.Delete(Client.No);

  Client.Free;
  AContext.Data := nil;

  BroadcastClientlist;
end;

DennisHB 6. Apr 2006 15:18

Re: TCPserver Disconnect Problem
 
Könnte daran liegen das beim Disconnect der ClientThread aus der Liste gelöscht wird und die nachfolgenden nachrutschen.

somit wird der erste Client gelöscht und der 2te nimmt dessen Position in der Liste ein...

das führt dazu das in der Liste nur noch 1 Element ist (0) und beim Zugriff auf [1] eine AV auftritt

DataCool 6. Apr 2006 15:56

Re: TCPserver Disconnect Problem
 
Hi,

wenn Du einen Client löscht bzw. dieser sich disconnected, verringert sich die Anzahl der Clients.
Deshalb solltest Du :

Delphi-Quellcode:
// Liste umgekehrt durchlaufen
for Count := ClientList.Count -1 downto 0 do begin

// Deine Zeile
for Count := 0 to ClientList.Count -1 do begin
Ausserdem solltest Du nicht :
Delphi-Quellcode:
Client.No    := lbClients.Items.Count;
verwenden. Denn dadurch können Clients die gleiche Nummer erhalten !!!!
Stattdessen solltest Du eine globale Zählervariable verwenden, die Du einfach immer um 1 erhöst und
diese dann als Client.No verwenden.

Gruß Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz