Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Telnet Exception EIdCloesdGracefully (https://www.delphipraxis.net/169601-telnet-exception-eidcloesdgracefully.html)

Jumpy 31. Jul 2012 10:17

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?

p80286 31. Jul 2012 10:46

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

Klaus01 31. Jul 2012 10:52

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

mjustin 31. Jul 2012 11:15

AW: Telnet Exception EIdCloesdGracefully
 
Zitat:

Zitat von Jumpy (Beitrag 1176422)
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?

Aus der Einführung in Indy auf http://conferences.embarcadero.com/article/32159:

Zitat:

If the other side has closed the connection and the socket is read or written to, EIdConnClosedGracefully will be raised by Indy. This is similar to attempting to read or write to a file that has been closed without your knowledge.
Die Exception wird ausgelöst wenn der Client versucht, nach dem Disconnect noch einmal auf den Socket zu schreiben oder zu lesen.

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.

Jumpy 31. Jul 2012 12:09

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:
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;
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?

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.

mjustin 31. Jul 2012 12:49

AW: Telnet Exception EIdCloesdGracefully
 
Zitat:

Zitat von Jumpy (Beitrag 1176447)
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.

Gibt es die Exception nur zur Entwicklungszeit (dann muss sie den Debugger-"Sprachexceptions" hinzugefügt werden) oder auch ausserhalb der IDE?

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

Jumpy 31. Jul 2012 13:10

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