Man muss doch eigentlich immer damit rechnen, dass ein Client auch mal ohne Abmeldung verschwindet... Außerdem gibts doch extra das
OnDisconnect Event. Naja, jedenfalls habe ich das selbe Problem wie MoP.
Ich hatte zuerst einen TCPServer benutzt, nachdem ich die Beiträge hier gelesen hatte, habe ich es dann mit einem IRCServer probiert und auch
AContext.Connection.CheckForGracefulDisconnect(tru e); eingebaut. Leider ohne Erfolg. Hier erstmal mein Code:
Delphi-Quellcode:
var
Server: TServer;
ClientIDs: set of byte;
Clients: Array[0..255] of TLWPClient;
implementation
{$R *.dfm}
procedure TServer.BtServerClick(Sender: TObject);
begin
if IRCServer.Active then begin
IRCServer.Active:=false;
BtServer.Caption:='Starten';
Memo.Lines.Add('Server gestoppt.');
end else begin
try
IRCServer.DefaultPort:=strtoint(EdPort.text);
IRCServer.Active:=true;
BtServer.Caption:='Stoppen';
Memo.Lines.Add('Server gestartet (Port: ' + EdPort.text + ').');
except
Memo.Lines.Add('Server konnte nicht gestartet werden.');
end;
end;
end;
procedure TServer.IRCServerConnect(AContext: TIdContext);
var
tmpClient: TLWPClient;
i: byte;
begin
tmpClient:=TLWPClient.Create;
while ((i<255) and (i in ClientIDs)) do Inc(i);
tmpClient.ID:=i;
tmpClient.IP:=AContext.Binding.PeerIP;
AContext.Data:=TObject(i);
Clients[i]:=tmpClient;
end;
procedure TServer.IRCServerDisconnect(AContext: TIdContext);
begin
AContext.Connection.CheckForGracefulDisconnect(true);
Clients[Byte(AContext.Data)].Destroy;
ClientIDs:=ClientIDs - [Byte(AContext.Data)];
end;
end.
Wenn ich den Server und einen zugehörigen Client starte, verbinde und dann wieder trenne, bekomme ich folgende Meldungen:
1.) (Von Delphi)
Zitat:
Debugger Exception Notification
Project TheServer.exe raised
exception class EIdSocketError with Message 'Socket Error # 10054 Connection reset by peer.'.
2.) (Vom Programm)
Zitat:
Application Error
Exception EAccessViolation in module TheServer.exe at 0000031BA.
Access coilation at address 004031BA in module 'TheServer.exe'. Read of address 00000040
3.) (Auch vom Programm)
Zitat:
Application Error
Exception EOSError in module TheServer.exe at 0000CB89.
System Error. Code: 5.
Zugriff verweigert.
Danach wird das Programm beendet.
Wäre schön, wenn jemand da einen Rat hätte.