![]() |
Telnet Exception EIdCloesdGracefully
Hallo,
ich versuche gerade ein älteres Programm via Telnet fernzusteuern und benutze dazu in meinem Programm die Indy-Komponente TIdTelnet. Prinzipiell klappt auch alles, wie ich mir das vorstelle und ich hab auch eine Art automatischem Dialog hinbekommen (mit ein paar Ideen hier aus dem Forum). Aber wenn ich nun entweder über das Command "Quit" das Ganze beende, oder über Telnet.Disconnect kommt immer die o.g. Exception. Das ist zum einen unschön, zum anderen scheint aber auch der TelnetServer der Gegenseite(?) dabei eine Macke abzubekommen (oder doch mein Programm). Denn wenn ich mich erneut verbinden will, wird der Login angefordert. Wird dieser gesendet friert mein Programm ein und es passiert gar nichts mehr. Das passiert auch, wenn ich das Programm wieder direkt nach der EIdCloesdGracefully neu starte und mich neu verbinden will. Erst ein paar Sekunden/Minuten später, mit einem neu gestarteten Programm, klappt die Verbindung wieder. Hat da jemand Erfahrungen, woran das liegen könnte? Vor allem das dies Exception kommt. Bei "CloesdGracefully" würd ich doch eher sagen: Danke schön, warum aber eine Exception? |
AW: Telnet Exception EIdCloesdGracefully
Ich denke "gracefully" muß mit "gnädiger Weise" übersetzt werden, das ist dann nicht mehr so positiv.
Hast Du noch andere Möglichkeiten, Dich zu verabschieden? Ich hab den Eindruck, da ist jemand eingeschnappt wie Du ihn behandelst. Gruß K-H |
AW: Telnet Exception EIdCloesdGracefully
.. nun, wenn Du auf dem Telnet-Server Quit eingibst - beendet der Server die Verbindung.
Darüber dürfte Dein Client nicht so erfreut sein. Was passiert wenn Du im Client die Verbindung beendest telnet.closeGracefully? Grüße Klaus |
AW: Telnet Exception EIdCloesdGracefully
Zitat:
![]() Zitat:
IdTelnet verwendet einen Thread um auf Nachrichten des Servers zu warten. Dieser Thread greift in einer Schleife lesend auf den Socket zu. Wenn die Verbindung getrennt wird (mit IdTelnet.Disconnect oder .Active := False, da bin ich nicht sicher), muss Indy auch den Thread beenden. Falls es nach dem Disconnect keine Stelle im eigenen Code mehr gibt die liest oder schreibt, würde ich erst einmal eine aktuelle Indy Version ausprobieren. |
AW: Telnet Exception EIdCloesdGracefully
Der Fehler tritt auf egal ob man Quit eingibt und dann der Server die COnnection beendet oder ob man selber im Code ein Disconnect des Clients aufruft.
Telnet.ClosedGratefully gibt's scheinbar nur als ReadOnly-Porperty. Hier mal der implementation-Teil meiner Testanwendung:
Delphi-Quellcode:
Ich hab auch mal versucht die Exception abzufangen, aber die kommt scheinbar an einer anderen Stelle. Ich kann diese aber nicht sehen, da sie wohl irgendwo in den Indys ist?
procedure TForm1.FormCreate(Sender: TObject);
begin //Hier Host und Port konfigurieren Telnet.Host:='192.168.101.24'; Telnet.Port:=4301; end; procedure TForm1.btnConnectClick(Sender: TObject); begin Telnet.OnDataAvailable:=React; Telnet.Connect; end; procedure TForm1.btnDisconnectClick(Sender: TObject); begin try // Telnet.SendCmd('Quit',-1); Telnet.Disconnect; except on E:Exception do Memo.Lines.Add('y:'+e.Message); end; end; procedure TForm1.btnSendClick(Sender: TObject); begin SendCommand; end; procedure TForm1.edCmdKeyPress(Sender: TObject; var Key: Char); begin if Key = CHR(13) then SendCommand; end; procedure TForm1.SendCommand; var cmd:String; begin cmd:=Trim(edCmd.Text); if Telnet.Connected then Telnet.SendCmd(cmd,-1) else showmessage('Client ist nicht verbunden!'); end; procedure TForm1.React(Buffer:String); begin try Memo.Lines.Add(Buffer); except on e:Exception do Memo.Lines.Add('x:'+e.Message); end; end; Ganz komisch ist, dass ich mich mit meiner Testanwendung jetzt gar nicht mehr an dem Server anmelden kann. Sobald ich den Usernamen sende via SendCmd friert alles ein. Connecten geht aber noch, so dass z.B. auch der Login-Prompt noch kommt. Mit Putty z.B. funzt es aber noch komplett. |
AW: Telnet Exception EIdCloesdGracefully
Zitat:
Intern verwendet Indy Exceptions um (sich selbst) etwas zu signalisieren oder eigene Threads zu beenden. Diese Exceptions werden von der IDE angezeigt, wenn sie nicht in den "Sprachexceptions" ausgeschlossen wurden |
AW: Telnet Exception EIdCloesdGracefully
@mjustin: Das war es. Hatte ich zuvor gerade in dem vorher von dir verlinkten Artikel gelesen und in den Debugger Optionen diese SilentEvents hinzugefügt und seitdem klappt es. Zumindest, wenn ich die Verbindung mit Quit beende. Bei Disconnect gibts immer eine andere Exception, ich vermute weil irgendwas aus einer geschl. Socket gelesen werden soll. Ist aber egal, da ich mit Quit gut klar komme. Da der Server auch noch nett mit "bye" antwortet, kann ich auch auswerten, dass das gut geklappt hat.
Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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