Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Meldung vom Socket - erfolgreich geschlossen (https://www.delphipraxis.net/41869-meldung-vom-socket-erfolgreich-geschlossen.html)

Harry M. 9. Mär 2005 23:47


Meldung vom Socket - erfolgreich geschlossen
 
hallo zusammen

ich habe da was mit den socket programmiert. die anwendung läuft einwandfrei.... nur manchmal kommt die meldung "die verbindung wurde erfolgreich geschlossen" eine solche meldung habe ich aber nicht in das programm aufgenommen und es kommt auch nicht immer wenn ich die verbindung beende. eben nur manchmal... weiß jemand woran das liegt?? try except habe ich schon "eingebunden". die meldung kommt aber trozdem. meiner aufffasung nach deshalb weil es ja in engerem sinne kein fehler ist... den ich abfangen will sondern eben nur eine meldung. und wie kann ich solche meldungen unterdrücken??

gruß delphicus

Binärbaum 9. Mär 2005 23:50

Re: Meldung vom Socket - erfolgreich geschlossen
 
Dazu könntest du ruhig mal den relevanten (!) Code-Abschnitt zeigen, damit man sehen kann, wie die Verbindung beendet wird und wo der Fehler liegen könnte.

MfG
Binärbaum

Luckie 9. Mär 2005 23:54

Re: Meldung vom Socket - erfolgreich geschlossen
 
Das ist eine Exception der Indys. Die Indy entwickler nutzen Exceptions nicht nur wenn Aufrufe fehlgeschlagen sind, sondern auch um erfolgreiche Aufrufe zu signalisieren. Robert Marquardt hat dazu mal was geschrieben. Du kannst diese Exception unterdrücken in dem du in den Debugger Optionen bei den Sprachexeptions die entsprechend Exception aufnimmst bei den zu irgnorirenden Exceptions. such einfach mal im Forum nach Hier im Forum suchendie verbindung wurde erfolgreich geschlossen.

Harry M. 10. Mär 2005 00:26

Re: Meldung vom Socket - erfolgreich geschlossen
 
hier mal nen bisschen code. ich hatte oben darauf verzichtet, weil die anwendung ja eigendlich läuft....
Delphi-Quellcode:

    Try
      ClientSocket1.Open;
      ClientSocket1.Socket.SendText(TimeToStr(TIME)+' '+TEMPSTR);
      ClientSocket1.Close;
      except
    end;
luckie wird die meldung auch dann unterdrückt wenn das programm nicht im debugger läuft? ich gehe erstmal auf die suche nach "verbindung wurde erfolgreich geschlossen"

& danke für die schnellen antworten

fisherman_b 10. Mär 2005 09:28

Re: Meldung vom Socket - erfolgreich geschlossen
 
In der zu den Indy Komponenten gehörenden Unit IdExceptions kannst Du nachschauen, welche unterschiedlichen Exceptions es dort gibt, und in Deinem Programm könntest Du mit diesem Wissen gezielt auf ein Eintreten der Exceptions reagieren.

EIdConnClosedGracefully is raised when remote side closes connection normally
EIdConnClosedGracefully = class(EIdSilentException);

Bei einer Exception handelt es sich nicht immer um einen Fehler, sondern eben um eine Ausnahmesituation, so auch im Falle der Exception EIdCOnnectionCLosedGracefully.

Generell kann man natürlich jede Exception selber überwachen:

Delphi-Quellcode:

try
  ClientSocket1.Open;
  ClientSocket1.Socket.SendText(TimeToStr(TIME)+' '+TEMPSTR);
  ClientSocket1.Close;
except
  on EIdConnClosedGracefully do
    begin
      // Hier kannst Du was mit der Exception anstellen, ohne dass sie automatisch angezeigt wird
    end;
  on EIdNotConnected do
    begin
      // Hier ebenfalls
    end;
end;
Gruss,

Bernhard

Muetze1 10. Mär 2005 10:08

Re: Meldung vom Socket - erfolgreich geschlossen
 
Moin!

Wie kommt ihr nur alle auf die Indy Komponenten? ClientSocket1 sieht für mich eher nach einer TClientSocket Instanz aus. Diese kann man noch so oft in einem Try/Except Block packen, das bringt meist nix, da der Socket in einem Thread läuft und somit auch die Exceptions unsynchron auftreten. Dafür hat der TClientSocket auch extra ein OnError Event um mit Exception umgehen zu können und diese auch zu unterdrücken (ErrorCode auf 0 setzen, siehe Hilfe).

Auch ist es so falsch programmiert in dem Beispiel. Wenn man die Methode Open aufruft, dann fängt der Socket an sich zu verbinden und versucht eine Verbindung aufzubauen - dieses wird aber in dem Thread erledigt und daher passiert das unsynchron zum VCL Hauptthread und somti wird danach SendText() aufgerufen obwohl er vielleicht noch beim verbinden ist. Es gibt extra ein OnConnect bzw. ein OnClientConnect um zu signalisieren wann die Verbindung aufgebaut wurde. Ein solches lineares aufrufen wie in dem Beispiel ist völliger Blödsinn und klappt meistens nur, wenn Client und Server auf dem lokalen Rechner laufen, dieser schnell genug ist und nicht ausgelastet. Selbst bei 2 Rechnern im lokalen LAN haut dies vielleicht öfters noch hin, aber es gibt keine Garantie. Über das Internet bzw. VPN oder ein anderes WAN haut der Code garantiert nicht mehr hin...

MfG
Muetze1

fisherman_b 10. Mär 2005 10:28

Re: Meldung vom Socket - erfolgreich geschlossen
 
Mensch... stimmt. Da bin ich wohl zu vorschnell auf den Indy-Zug aufgesprungen. :roll:

Harry M. 10. Mär 2005 18:43

Re: Meldung vom Socket - erfolgreich geschlossen
 
ich habe jetzt das
Code:
ClientSocket1.Socket.SendText(TimeToStr(TIME)+' '+TEMPSTR);
ClientSocket1.Close;
in das ClientSocketConnect-Ereignis gepackt mal sehen ob es jetz geht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 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