Fehlerbehandlung TClientSocket



  • Hallo

    Ich möchte eine Fehlerbehandlung für das Ereignis, wenn sich ein TClientSocket an einem nicht vorhandenem TServerSocket anmelden will, erstellen.
    In der Hilfe des BCB steht, dass man die Funktion OnError vom TClientSocket benutzen solle. Bei erfolgreicher Behandlung des Fehlers kann man "ErrorCode" auf 0 setzen damit keine ESocketError-Exception ausgelöst wird.

    Bei mir erscheint die Fehlermeldung trotzdem 😡

    HILFE!!!



  • Original erstellt von <tuchs>:
    Bei mir erscheint die Fehlermeldung trotzdem

    Auch dann, wenn du das Progamm ausserhalb des BCB startest?



  • Ja!



  • Kann ich hier nicht nachvollziehen... code? (z.B. deine OnError methode?)

    -junix



  • Kann ich hier nicht nachvollziehen... code? (z.B. deine OnError methode?)

    void __fastcall TForm1::ClientSocketError(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
    {
       ErrorCode = 0;
    }
    


  • Kann ich ebenfalls nicht nachvollziehen, der von dir gezeigte Code verhindert zuverlässig das Auftreten einer ESocketError-Exception. Bist du denn sicher, dass es sich um genau so eine Exception handelt?



  • Vieleicht kannst du es anhand der Fehlermedung Nachfollziehen:

    Im Projekt blubb.exe ist eine Exeption der Klasse ESocketError aufgetreten. Meldung: 'Windows-Socket-Fehler: der angegebene Host ist unbekannt(11001), auf API 'ASync Lookup''. Prozess wurde angehalten...

    Und wenn ich das Programm ausserhalb des BCB starte nur Meldung (Windows-Socket-Fehler: der angegebene Host ist unbekannt(11001), auf API 'ASync Lookup').



  • Und du bist sicher, dass sie von der ClientSocket-Komponente verursacht wird, für die du das OnErrorEvent geschrieben hast?

    Hast du das Ganze mal in einem Miniprogramm getestet (blanke Form, nur eine ClientSocket-Komponente)?



  • Original erstellt von <tuchs>:
    Prozess wurde angehalten...

    Klingt aber sehr nach BCB-Umgebung...... Nochmals jansens frage: Hast du das Programm schonmal ohne den BCB gestartet (doppelklick auf EXE) und nachgeprüft ob dann die exception ebenfalls auftritt?

    -junix



  • Original erstellt von Jansen:
    Hast du das Ganze mal in einem Miniprogramm getestet (blanke Form, nur eine ClientSocket-Komponente)?

    Ja.

    Original erstellt von Junix:
    Klingt aber sehr nach BCB-Umgebung...... Nochmals jansens frage: Hast du das Programm schonmal ohne den BCB gestartet (doppelklick auf EXE) und nachgeprüft ob dann die exception ebenfalls auftritt?

    Original erstellt von Mir:
    **
    Und wenn ich das Programm ausserhalb des BCB starte nur Meldung (Windows-Socket-Fehler: der angegebene Host ist unbekannt(11001), auf API 'ASync Lookup').
    **

    ... tuchs



  • Ich habe gerade gemerkt, dass der Fehler nur auftritt, wenn der Host nicht im Netzwerk vorhanden ist.
    Ich müsste also testen, ob es den Host überhaupt gibt.
    Weiss jemand, wie mann so etwas macht?



  • Warum versuchst du nicht einfach, die Exception auf herkömmliche Weise, mit try/catch abzufangen?



  • Weil man beim verbinden nur die Eigenschaft "active" (bool) der Komponente auf true setzt. Man hat also keine Funktion, welche man in ein "try" reinnehmen könnte...



  • Probiert hast du das aber nicht, oder?

    try
      {
        ClientSocket1->Active = true;
      }
      catch(ESocketError &E)
      {
        ShowMessage(E.Message);
      }
    

    "Catcht" tadellos.



  • (freu)
    vielen Dank! jetzt leuft es!!!



  • Ich habs noch so gemacht, dass ich den Server erstmal pinge (IdICMP) so kann man verhindern, dass er nicht versucht auf einen Host zu connecten der nicht existiert.

    J0



  • Das ist doch unnötig, da
    a) die Exception selbst eine zuverlässige Überprüfung der Erreichbarkeit darstellt, und
    b) ein Ping keineswegs sicherstellt, dass die Gegenstelle (nicht) erreichbar ist. Schliesslich kann diese per Firewall o.ä. so konfiguriert sein, dass sie auf Pings nicht antwortet, auf dem Socket-Port aber sehr wohl Verbindungen annimmt.



  • oh, das mit punkt b) wusste ich nicht. man lernt ja nie aus 😉

    J0



  • Ich verwende anstatt ...Active = true immer Socket->Open().
    Sollte man hierfür auch wie oben beschrieben eine try-catch-Konstruktion vorsehen? Ohne try-catch erhalte ich nämlich auch ab und zu einen Windows-Socket-Fehler ebenso wie tuchs.


Anmelden zum Antworten