AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Telnet Exception EIdCloesdGracefully
Thema durchsuchen
Ansicht
Themen-Optionen

Telnet Exception EIdCloesdGracefully

Ein Thema von Jumpy · begonnen am 31. Jul 2012 · letzter Beitrag vom 31. Jul 2012
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

Telnet Exception EIdCloesdGracefully

  Alt 31. Jul 2012, 10:17
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?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Telnet Exception EIdCloesdGracefully

  Alt 31. Jul 2012, 10:46
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Telnet Exception EIdCloesdGracefully

  Alt 31. Jul 2012, 10:52
.. 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
Klaus
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Telnet Exception EIdCloesdGracefully

  Alt 31. Jul 2012, 11:15
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.
Michael Justin
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Telnet Exception EIdCloesdGracefully

  Alt 31. Jul 2012, 12:09
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.
Ralph

Geändert von Jumpy (31. Jul 2012 um 12:19 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Telnet Exception EIdCloesdGracefully

  Alt 31. Jul 2012, 12:49
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
Michael Justin
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: Telnet Exception EIdCloesdGracefully

  Alt 31. Jul 2012, 13:10
@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!
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz