![]() |
Server: Socket-Fehler # 10054
Hey,
also ich hab schon das Forum hier durchsucht und bei google gesucht, aber die möglichen Lösungen haben entweder nicht funktioniert, oder ich hab sie nicht verstanden. Programmier mit Delphi jetzt erst seit 1 1/2 Jahren inner Schule. Auf jedenfall hab ich mit den Indy Klassen TCPClient und TCPServer einen Chat programmiert. Den Client hab ich nebenläufig programmiert, sodass ich keinen Timer benutze der "nur" alle 500 Millisekunden die Nachrichten ausliest. Der Chat funktioniert soweit wunderbar, aber ich hab ein Problem, wenn sich der Client nicht abmeldet (Wenn er also z.b. über Task-Manager-> Prozesse einfach beendet wird). Dann kommt beim Server die Fehlermeldung: Socket-Fehler # 10054 Die Verbindung wurde von Peer zurückgesetzt. Hier erma der Code:
Delphi-Quellcode:
So, wenn sich also ein Client nicht abmeldet, dann stürzt mein Server an der stelle s:=readln ab.
procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var s:string; begin with AThread.Connection do begin s:=readln; //Der Fehler ist bei diesem s:=readln //Hier kommt dann das, was der Server machen soll, wenn s ein Protokollbefehl ist: //Also if s='...' then ... end; end; Ist soweit auch verständlich, aber ich krieg diesen Fehler nicht weg, egal was ich bisher versucht habe. Hoffe ihr könnt mir da helfen. Greetz Master of Phoenix |
Re: Server: Socket-Fehler # 10054
Hat denn keiner von euch vllt nen Ansatz wie man das Problem lösen könnte??
|
Re: Server: Socket-Fehler # 10054
Habe bisher noch nicht mit den Indys gearbeitet, aber es müsste doch eine Möglichkeit geben, mit der du feststellen kannst, ob der Client noch verbunden (Connected?) ist.
|
Re: Server: Socket-Fehler # 10054
Zitat:
Delphi-Quellcode:
procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var s:string; begin with AThread.Connection do try s:=readln; //Der Fehler ist bei diesem s:=readln except on e: exception do Showmessage(e.Message); //Hier den Fehler behandeln also in deinem Fall Socket-Fehler # 10054 end; end; Gruss |
Re: Server: Socket-Fehler # 10054
Zitat:
Würd das aber gerne so haben, dass wenn der Fehler kommt diese Verbindung einfach geschlossen wird und der rest weiter arbeitet und sich nicht auf alle Verbindungen auswirkt. Zitat:
Delphi-Quellcode:
Funktioniert aber auch nicht und is glaub ich nen Denkfehler, da der Server ja eigentlich noch denkt, dass er ne Verbindung hat, er kann nur nicht readln Ausführen.
if Athread.Connection.Connected=true then
with AThread.Connection do begin s:=readln; //... end; |
Re: Server: Socket-Fehler # 10054
Hat niemand ne Lösung? Wenns auch nur nen Ansatz wär, würde vllt. ja schon reichen.
Ich möchte einfach nich, dass mein Server abstüzt, nur weil ein Client sich nicht abgemeldet hat. |
Re: Server: Socket-Fehler # 10054
Thread.Connection.CheckForDisconnect evtl.?
|
Re: Server: Socket-Fehler # 10054
Hi,
ich würde für so einen Zweck den TidIRCServer nehmen, der ist direkt für sowas gedacht und hat ein recht stabiles Verhalten. |
Re: Server: Socket-Fehler # 10054
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:
Wenn ich den Server und einen zugehörigen Client starte, verbinde und dann wieder trenne, bekomme ich folgende Meldungen:
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. 1.) (Von Delphi) Zitat:
Zitat:
Zitat:
Wäre schön, wenn jemand da einen Rat hätte. |
Re: Server: Socket-Fehler # 10054
:arrow: Push *duck*
Hat keiner ne Idee? Ich möchte ja ertsmal nur erreichen, dass der Server nicht gleich abstürzt... Ob ein Client noch da ist lässt sich ja rausfinden... |
Re: Server: Socket-Fehler # 10054
Nun es ist schon ca. 3 Jahre her, das ich einen http-Server mit den Indys gebastelt habe ,der aber heute noch funktioniert.
Folgender Effekt: Innerhalber der Delphi-IDE werden alle Exceptions vom Debugger angezeigt und liessen sich auch nicht abschalten/abfangen. Starte ich aber nur die Exe ausserhalb Delphi, gibt's,gab es keine Probleme und mir wurde erklärt das das völlig normal sei. |
Re: Server: Socket-Fehler # 10054
Dass der Debugger alle Exceptions anzeigt (auch z.B. bei try ... except Blöcken) hab ich auch schon rausgefunden, allerdings stürzt mein Programm auch ab, wenn ich die *.exe unabhängig von Delphi starte und dann ein Client ohne sich abzumelden beendet wird.
|
Re: Server: Socket-Fehler # 10054
Diese Demo ist ist absolut minimalistisch, aber funtioniert fehlerfrei, nachdem man in den ProjektDateieien (1*Client und 1* Server)
folgende Zeile deaktiviert hat,Du verwendest allerdings Indy9 solltest evtl. updaten. oder Context in PeerThread zurückbasteln.
Delphi-Quellcode:
begin
Application.Initialize; // Application.MainFormOnTaskbar := True; <--------- !!! Application.CreateForm(TForm1, Form1); Application.Run; end. ![]() Und noch Indy9 vs Indy 10 ![]() |
Re: Server: Socket-Fehler # 10054
Den Client noch etwas modifiziert.Wichtig ist das z.B. SendM zu TForm gehört ,sonst kann er nichts mit dem TCP.Client anfangen,aber die
Compilerfehlermeldung seht Ihr dann sofort.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient; type TForm1 = class(TForm) TCPClient: TIdTCPClient; Button1: TButton; Button2: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private Procedure SendM(S:String); { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} Procedure TForm1.SendM(S:String); begin if TCPClient.Connected then begin TCPClient.IOHandler.WriteLn(S); end; end; procedure TForm1.Button1Click(Sender: TObject); begin TCPClient.Connect; SendM('Dies ist eine Nachricht vom Clienten.'); end; procedure TForm1.Button2Click(Sender: TObject); begin TCPClient.Disconnect; end; procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of vk_Return:SendM(Edit1.Text); end; end; end. |
Re: Server: Socket-Fehler # 10054
Ich werf den Server auch mal hier rein,ist aber nicht von mir,many thx 2 halinchen.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, idContext; type TForm1 = class(TForm) TCPServer: TIdTCPServer; Memo1: TMemo; procedure TCPServerExecute(AContext: TIdContext); procedure TCPServerConnect(AContext: TIdContext); procedure TCPServerDisconnect(AContext: TIdContext); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.TCPServerConnect(AContext: TIdContext); begin Memo1.Lines.Add('Verbindung: ' + AContext.Binding.PeerIP); end; procedure TForm1.TCPServerDisconnect(AContext: TIdContext); begin Memo1.Lines.Add('Verbindungsabbruch: ' + AContext.Binding.PeerIP); end; procedure TForm1.TCPServerExecute(AContext: TIdContext); begin Memo1.Lines.Add('Nachricht: ' + AContext.Connection.IOHandler.ReadLn); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 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