tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von CSANecromancer
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
1390
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von real_benedikt
    real_benedikt real_benedikt ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    43
    Hallo liebe Community,

    ich habe ein Problem, bei der mir 2 Stunden mit google auch nicht weiterhelfen.
    Ich schreibe zurzeit ein kleines tool für einen Clan, welches erlaubt einen Gameserver zu steuern. Da müssen dann natürlich auch die aktuellen Serverdaten abgefragt werden.

    Das habe ich folgendermaßen gelöst:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    senden := #$FF#$FF#$FF#$FF+'getstatus'+#$00;
        IdUDPClient1.Host := Label6.Caption;
        IdUDPClient1.Active := true;
        IdUDPClient1.BufferSize := 118192;
        IdUDPClient1.Send(senden);
        IdUDPClient1.ReceiveBuffer( Buffer, 118192);
        j := 0;
        for i := 0 to length(Buffer) do begin
          str1 := Char(Buffer[i]);
          strTemp := strTemp + str1;
        end;
        IdUDPClient1.Active := false;
      Daten := strTemp;

    Die Daten werden dann natürlich noch dem entsprechend gefiltert. Das ganze steckt in einem Timer und aktualisiert sich jede Sekunde.

    Nun was ist aber wenn der Server einmal abgestürzt ist. Dann bekomme ich diesen Socket-Fehler #10054 und das Programm beendet sich.

    Kann man denn diesen Fehler nicht irgendwie abfangen und dann in ein Label einfach nur reinschreiben, dass der Server DOWN ist?

    Danke schonmal im Voraus

    Bene
     
    ACHTUNG: Großer großer großer Anfänger am Arbeiten......

  2. #2
    Registriert seit
    Mar 2004
    Beiträge
    441
    Mit einem try..except sollte der Fehler abzufangen und zu interpretieren sein.
     

  3. #3
    Avatar von real_benedikt
    real_benedikt real_benedikt ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    43
    Hallo,

    ich glaube das habe ich schon versucht. Ist das so korrekt?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
       try
        senden := #$FF#$FF#$FF#$FF+'getstatus'+#$00;
        IdUDPClient1.Host := Label6.Caption;
        IdUDPClient1.Active := true;
      except
        Timer1.Enabled := False;
      end;
        IdUDPClient1.BufferSize := 118192;
        IdUDPClient1.Send(senden);
        IdUDPClient1.ReceiveBuffer( Buffer, 118192);
        j := 0;
        for i := 0 to length(Buffer) do begin
          str1 := Char(Buffer[i]);
          strTemp := strTemp + str1;
        end;
        IdUDPClient1.Active := false;
      Daten := strTemp;
     
    ACHTUNG: Großer großer großer Anfänger am Arbeiten......

  4. #4
    Registriert seit
    Mar 2004
    Beiträge
    441
    Ich persönlich würde noch die restlichen Anweisungen mit dem IdUDPClient1 mit in den try aufnehmen. Und den except habe ich in meinen Programmen ein bißchen detaillierter, z.B.
    Code delphi:
    1
    2
    3
    4
    5
    6
    
    ...
    except 
      on EConvertError do 
      begin
        ...(mach was)
      end;

    Ich weiß jetzt natürlich nicht, was für einen Socketfehler du bekommst, aber so ähnlich könntest du den dann abfangen und entsprechend drauf reagieren, also z.B. den Timer deaktivieren und einen MessageDialog ausgeben.

    Wenn du nicht genau weisst, was für eine Exception geworfen wird, dann kannst du ja auch ganz unspezifiziert ein
    Code delphi:
    1
    2
    3
    4
    5
    6
    7
    8
    
    ...
    except
      on e: Exception do
      begin
        Timer1.Enabled := false;
        CreateMessageDialog(e.Message, mtWarning, [mbOk]);
      end;
    end;
    benutzen.
     

  5. #5
    Avatar von real_benedikt
    real_benedikt real_benedikt ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    43
    Hallo,

    alles klar genau so habe ich das jetzt eingesetzt, nur wird die exception nicht ausgeführt.
    Es erscheint immer noch folgendes:

    Code :
    1
    
    Eine Exception der Klasse EIdSocketError aufgetreten. Meldung: 'Socket-Fehler # 10054

    Mein Code aktuell:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    try
        senden := #$FF#$FF#$FF#$FF+'getstatus'+#$00;
        IdUDPClient1.Host := Label6.Caption;
        IdUDPClient1.Active := true;
    except  on e: Exception do  begin
        Timer1.Enabled := false;    CreateMessageDialog(e.Message, mtWarning, [mbOk]);
        end;
    end;

    Was ist da noch falsch?
    Geändert von real_benedikt (14.10.08 um 22:23 Uhr)
     
    ACHTUNG: Großer großer großer Anfänger am Arbeiten......

  6. #6
    Registriert seit
    Mar 2004
    Beiträge
    441
    Versuche es mal mit
    Code delphi:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    try
        senden := #$FF#$FF#$FF#$FF+'getstatus'+#$00;
        IdUDPClient1.Host := Label6.Caption;
        IdUDPClient1.Active := true;
    except  on e: EIdSocketError do  
      begin
        Timer1.Enabled := false;
        IdUDPClient1.Active := false;
        CreateMessageDialog('Eigene Fehlermeldung: ' + e.Message, mtWarning, [mbOk]);
      end;
    end;

    Und lasse das Ganze dann auch mal komplett durchlaufen. Wenn dir also beim Testen die Exception geworfen wird, dann lass das Programm einfach weiter ausführen und schau, ob der except-Teil auch aufgerufen wird. Der Single Step-Debugger macht das Exceptionhandling beim Testen nicht unbedingt einfacher.
     

  7. #7
    Avatar von real_benedikt
    real_benedikt real_benedikt ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    43
    Hallo,

    okey habe ich gemacht, musste noch IdException in die Uses einfügen.

    Der except teil wird auch nachdem weiterlaufen lassen nicht ausgeführt

    Geändert von real_benedikt (15.10.08 um 21:06 Uhr)
     
    ACHTUNG: Großer großer großer Anfänger am Arbeiten......

  8. #8
    Registriert seit
    Mar 2004
    Beiträge
    441
    Zitat Zitat von real_benedikt Beitrag anzeigen
    ...Dann bekomme ich diesen Socket-Fehler #10054 und das Programm beendet sich...
    Zitat Zitat von real_benedikt Beitrag anzeigen
    Der except teil wird auch nachdem weiterlaufen lassen nicht ausgeführt
    Verdammt. Dann ist der Socketfehler wohl keine echte Exception. Dann müsstest du mal in der Dokumentation zu der Komponente nachschauen, wie du so einen Fehler abfangen kannst.
     

  9. #9
    Avatar von real_benedikt
    real_benedikt real_benedikt ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    43
    Hallo,

    ich habe da was gefunden:

    http://www.informatik-treff.de/mater...entsocket.html

    Ganz unten steht was von : property OnError

    Nur da ich Anfänger bin weiss ich nicht wie ich das einsetzten soll
     
    ACHTUNG: Großer großer großer Anfänger am Arbeiten......

  10. #10
    Registriert seit
    Mar 2004
    Beiträge
    441
    So, jetzt aber...

    Ich habe mir mal ordentlich Zeit genommen (geht auf Arbeit leider nicht) und mir jetzt mal alles angeschaut, was du so gepostet hat. Ich hatte bisher noch nie was mit Client-/Socketprogrammierung unter Delphi zu tun, deswegen musste ich erstmal schauen, was da überhaupt alles für Komponenten mit rein spielen. Der von dir gepostete Link hilft leider nicht weiter, da er sich auf eine TClientSocket-Komponente bezieht, du aber, wenn ich das richtig verstehe, eine Indy UDP Client-Komponente verwendest (ausgehend von dem Namen deiner Komponente). Zu dieser habe ich via Google das hier gefunden:
    http://conferences.codegear.com/article/32159

    Ich habe den Artikel jetzt nicht vollständig gelesen, sondern mir erstmal nur die wichtigten Passagen rausgepickt. Suchbegriff "OnError" in der Seite liefert Folgendes:
    There are no OnError events, so do not go looking for them.
    Das Ganze steht unter der Überschrift "Handling Exceptions" und da wird wunderschön beschrieben, wie mit Fehlern der Indy-Komponenten umzugehen ist.
    Im Prinzip läuft es auf ein Exception-Handling hinaus, wie ich es schon vor hatte (also mit try..catch..finally und dem ganzen Krempel). Wie das jetzt speziell mit der von dir verwendeten Komponente funktioniert ist da (fast haarklein) beschrieben inklusive Beispielcode.

    Ich denke, daß dich dieser Artikel deinem Ziel sehr viel näher bringen wird.
    real_benedikt bedankt sich. 

  11. #11
    Avatar von real_benedikt
    real_benedikt real_benedikt ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    43
    Ahh,

    ja genauuu daas ist es vielen vielen vielen vielen Dank

    Habe es genau so gemacht und es geht

    Grüße

    Bene
     
    ACHTUNG: Großer großer großer Anfänger am Arbeiten......

  12. #12
    Registriert seit
    Mar 2004
    Beiträge
    441
    Zitat Zitat von real_benedikt Beitrag anzeigen
    Habe es genau so gemacht und es geht
    Das ist die Hauptsache.
     

Ähnliche Themen

  1. Socket-Fehler
    Von PhilippGer im Forum Java Grundlagen
    Antworten: 6
    Letzter Beitrag: 13.07.09, 15:42
  2. Formulare - Fehler abfangen
    Von FactorX im Forum PHP
    Antworten: 1
    Letzter Beitrag: 13.03.06, 19:53
  3. Fehler abfangen
    Von Stgt im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 21.01.05, 16:51
  4. ftp Fehler abfangen
    Von mot im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 09.11.04, 17:36
  5. fehler abfangen
    Von Horusab im Forum PHP
    Antworten: 4
    Letzter Beitrag: 02.09.03, 20:55