IdUDP Socket-Fehler abfangen

real_benedikt

Mitglied
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:
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
 
Hallo,

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

Code:
   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;
 
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:
...
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:
...
except
  on e: Exception do
  begin
    Timer1.Enabled := false;
    CreateMessageDialog(e.Message, mtWarning, [mbOk]);
  end;
end;
benutzen.
 
Hallo,

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

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

Mein Code aktuell:

Code:
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?
 
Zuletzt bearbeitet:
Versuche es mal mit
Code:
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. ;)
 
Hallo,

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

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

:confused:
 
Zuletzt bearbeitet:
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.
 
Zurück