Benutzer mit den meisten Antworten
"System.Net.Sockets.SocketException" abfangen

Frage
-
Antworten
-
Hallo Hans-J.,
zum Beispiel so:
catch (Exception exp) { Melde(exp.Message); if (tcpStream != null) tcpStream.Close(); if (tcpClient != null) tcpClient.Close(); NeuVerbinden(4); return; }
aus Beispiel-Projekt-Download: http://dzaebel.net/Downloads/TcpClientServer4.zipaus Artikel:
[Client-Server Kommunikation mit dem TcpClient und TcpListener]
http://dzaebel.net/TcpClientServer.htm_____________________
- Das wird langsam Kaffeesatzleserei, aber selbst wenn der Ansatz ok sein
- sollte, gibt es für -2147467259 doch bestimmt einen symbolischen Wert?
Will man genau den Fehler eines bestimmten Fehlercode behandeln, so ist das nicht unbedingt unsauber, wenn man sich auf dokumentierte Fehlercodes oder .NET-Enumerationen bezieht.
In Deinem Fall (wenn denn die explizite Catch unbedingt erwünscht ist) würde ich lieber die SocketException catch-en und dann über den SocketErrorCode gehen. Also nicht GetHRForLastWin32Error benutzen, sondern etwas wie:mit folgenden dokumentierten Fehlercodes oder die SocketError-Enumeration:
catch (SocketException exp) { // var nativeFehlerCode = exp.NativeErrorCode; if (exp.SocketErrorCode == SocketError.ConnectionRefused) // o.ä. { } }
[Windows Sockets Error Codes (Windows)]
http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspxDeine Fehlernummer ist ja hexadezimal geshiftet: '0x80004005' - aber das können verschiedenartike Fehler sein, deswegen ist etwas wie SocketError hier besser.
Allgemein solltest Du Dir aber klar sein, dass auch andere Fehler auftreten können, die eigentlich ähnlich behandelt werden müssten, wobei man dann wieder bei der allgemeineren Exception oder SocketException ist.
ciao Frank- Bearbeitet Frank Dzaebel Samstag, 10. September 2011 11:17
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 12. September 2011 06:30
- Als Antwort markiert Robert BreitenhoferModerator Montag, 19. September 2011 11:13
-
-2147467259 ist hex 80004005 für den Mülleimer, wo alles abgekippt wird, was nicht einfach zuordenbar ist. Das ist leider so.Wenn es keine weitere InnerExeception gibt, hast Du wenig Chancen, etwas Sinnvolles zu erhalten.--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 12. September 2011 06:30
- Als Antwort markiert Robert BreitenhoferModerator Montag, 19. September 2011 11:13
Alle Antworten
-
Meine Frage ist nun, wie ... ich die abfangen kann
Hallo Hans Hans-J. Ude,
Kannst Du bitte Dein Problem deutlicher und völlig beschreiben? Relevanter Code zu posten wäre auch nicht schlecht.
Exceptions and Exception Handling (C# Programming Guide)
Danke und Grüße,
Robert
-
Hallo Robert,Am 07.09.2011 15:40, schrieb Robert Breitenhofer:> Kannst Du bitte Dein Problem deutlicher und völlig beschreiben?> Relevanter Code zu posten wäre auch nicht schlecht.Ich glaube speziellen code zu posten ist hier nicht hilfreich. FolgendesSzenario:1. Ich baue basierend auf einem TcpClient eine Verbindung zum AndroidEmulator auf (localhost, port 5554) und tausche mit dem Datan aus,funktioniert alles.2. Ich kille den Androiden bei bestehender Verbindung ohne laufendenDatenaustausch. Dann bekomme ich eine MessageBox mit diesem Text"Von der Übertragungsverbindung können keine Daten gelesen werden: Einevorhandene Verbindung wurde vom Remotehost geschlossen."Im VS Debugger:Eine Ausnahme (erste Chance) des Typs "System.IO.IOException" ist inSystem.dll aufgetreten.Das Ereignis würde ich gerne abfangen, damit ich meine internenVariabelen entsprechen (zurück)setzen kann. Die ganze Kommunikationläuft asynchron, d.h. ich warte nicht explizit auf eine Antwort vom Host.Gruß,Hajü
-
Hallo Hans-J.,
evtl. könnte folgendes gemeint sein, was in .NET 4.0 aber behoben ist:
[c# - Catch unhandled SocketException during asynchronous HttpWebResponse read - Stack Overflow]
http://stackoverflow.com/questions/1626499/catch-unhandled-socketexception-during-asynchronous-httpwebresponse-read[DeflateStream needs to handle exceptions from BeginRead on underlying streams | Microsoft Connect]
https://connect.microsoft.com/VisualStudio/feedback/details/510564/deflatestream-needs-to-handle-exceptions-from-beginread-on-underlying-streams
ciao Frank -
Ich hab rausgefunden, dass bei einem hostseitigen Disconnect derReadCallback() nochmal aufgerufen wird und die Messagebox erzeugt hat.An der Stelle rufe ich jetzt mein DoDisconnect() auf, der alles aufräumtund neu vorbereitet.public void ReadCallback(IAsyncResult ar){int numRead = 0;try{if (Remote.Connected == true)numRead = Remote.GetStream().EndRead(ar);}catch (Exception ex){// MessageBox.Show(ex.Message);Invoke(new Action(DoDisconnect));}..} // End ReadCallbackDie Frage ist jetzt, wie ich die Exception eindeutig identifizierenkann, und nur in dem speziellen Fall DoDisconnect() aufrufe.Aus der MSDNDoku und dem was ich sonst gefunden habe werde ich nicht so recht schlau.ich hab mal mit so Konstrukten wieif (ex.GetType().GUID.ToString() == "a164c0bf-67ae-3c7e-bc05-bfe24a8cdb62")rumexperimentiert, den GUID Wert habe ich aus dem Debugger. Aber dasscheint mir alles vage und unsicher.Hajü
-
Am 10.09.2011 00:07, schrieb Hans-J. Ude:> ich hab mal mit so Konstrukten wie> if (ex.GetType().GUID.ToString() == "a164c0bf-67ae-3c7e-bc05-bfe24a8cdb62")> rumexperimentiert, den GUID Wert habe ich aus dem Debugger. Aber das> scheint mir alles vage und unsicher.oder so?catch (IOException ex){if (Marshal.GetHRForException(ex.InnerException) == -2147467259)Invoke(new Action(DoDisconnect));elseMessageBox.Show(ex.Message);}Das wird langsam Kaffeesatzleserei, aber selbst wenn der Ansatz ok seinsollte, gibt es für -2147467259 doch bestimmt einen symbolischen Wert?Hajü
-
Hallo Hans-J.,
zum Beispiel so:
catch (Exception exp) { Melde(exp.Message); if (tcpStream != null) tcpStream.Close(); if (tcpClient != null) tcpClient.Close(); NeuVerbinden(4); return; }
aus Beispiel-Projekt-Download: http://dzaebel.net/Downloads/TcpClientServer4.zipaus Artikel:
[Client-Server Kommunikation mit dem TcpClient und TcpListener]
http://dzaebel.net/TcpClientServer.htm_____________________
- Das wird langsam Kaffeesatzleserei, aber selbst wenn der Ansatz ok sein
- sollte, gibt es für -2147467259 doch bestimmt einen symbolischen Wert?
Will man genau den Fehler eines bestimmten Fehlercode behandeln, so ist das nicht unbedingt unsauber, wenn man sich auf dokumentierte Fehlercodes oder .NET-Enumerationen bezieht.
In Deinem Fall (wenn denn die explizite Catch unbedingt erwünscht ist) würde ich lieber die SocketException catch-en und dann über den SocketErrorCode gehen. Also nicht GetHRForLastWin32Error benutzen, sondern etwas wie:mit folgenden dokumentierten Fehlercodes oder die SocketError-Enumeration:
catch (SocketException exp) { // var nativeFehlerCode = exp.NativeErrorCode; if (exp.SocketErrorCode == SocketError.ConnectionRefused) // o.ä. { } }
[Windows Sockets Error Codes (Windows)]
http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspxDeine Fehlernummer ist ja hexadezimal geshiftet: '0x80004005' - aber das können verschiedenartike Fehler sein, deswegen ist etwas wie SocketError hier besser.
Allgemein solltest Du Dir aber klar sein, dass auch andere Fehler auftreten können, die eigentlich ähnlich behandelt werden müssten, wobei man dann wieder bei der allgemeineren Exception oder SocketException ist.
ciao Frank- Bearbeitet Frank Dzaebel Samstag, 10. September 2011 11:17
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 12. September 2011 06:30
- Als Antwort markiert Robert BreitenhoferModerator Montag, 19. September 2011 11:13
-
Am 10.09.2011 12:18, schrieb Frank Dzaebel [MVP]:>> aus Beispiel-Projekt-Download:Das funktioniert leider bei mir nicht. Der grundsätzliche Unterschiedbesteht darin, dass du mit synchroner Kommunikation arbeitest und ichmit asynchroner. In deinem Beispiel kriegt der Client gar nicht mit,wenn der Server unerwartet beendet wird. Das mitif (Marshal.GetHRForException(ex.InnerException) == -2147467259) ...funktioniert bei mir ja, aber ich habe Zweifel das es auch zuverlässigfunktioniert und diese magische -2147467259 ist auch unsauberer Stil.Gruß,Haü
-
-2147467259 ist hex 80004005 für den Mülleimer, wo alles abgekippt wird, was nicht einfach zuordenbar ist. Das ist leider so.Wenn es keine weitere InnerExeception gibt, hast Du wenig Chancen, etwas Sinnvolles zu erhalten.--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 12. September 2011 06:30
- Als Antwort markiert Robert BreitenhoferModerator Montag, 19. September 2011 11:13
-
Hallo Hans-J.,
- In deinem Beispiel kriegt der Client gar nicht mit,
wenn der Server unerwartet beendet wird.
doch, wenn man auf OK drückt, was bei einem asynchronen Szenario einem regelmäßigen Pollen entspricht.
- Das mit "if (Marshal.GetHRForException(ex.InnerException) == -2147467259) ...
funktioniert bei mir ja, aber ich habe Zweifel das es auch zuverlässigfunktioniert und diese magische -2147467259 ist auch unsauberer Stil.
da hatte ich Dir schon empfohlen, die SocketException mit der SocketError-Enumeration über SocketErrorCode zu nehmen. Ich hatte bereits erwähnt, dass '0x80004005' verschiedenartige Fehler sein können, was aber in Deinem nicht unbedingt unsauber sein muss. Welcher Fehler kommt denn bei Dir im SocketErrorCode, wenn Du die SocketException catched? 80004005 ist schon auch dokumentiert, aber halt auch ein catch all. Die SocketError-Enumeration ist ja weit weg von unsauber.
ciao Frank - In deinem Beispiel kriegt der Client gar nicht mit,
-
Am 19.09.2011 13:12, schrieb Robert Breitenhofer:> Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.> Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Prinzipiell ja, allerdings bin ich mit diesem Konstrukt, insbesonderedieser magischen '-2147467259' nicht wirklich zufrieden. Statt diesernichtssagenden Zahl hätte ich da lieber etwas Symbolisches, das istunsauberer Stil so. Das ist genau 0x80004005, dafür muß doch irgenwoeine Konstante existieren. Und dieses Marshal.xyz(...) um an die Nummerzu kommen finde ich auch nicht gerade elegant.catch (IOException ex){Exception e2 = ex.InnerException;if (Marshal.GetHRForException(e2) == -2147467259){// irgendwas machen}}Dazu kommt noch, daß 0x80004005 eine SocketException im Allgemeinenbedeutet, die aber noch verschiedene Ursachen haben kann. Der Debuggersagt mir:+ e2 {System.Net.Sockets.SocketException (0x80004005): Eine vorhandeneVerbindung wurde vom Remotehost geschlossenbei System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)bei System.Net.Sockets.NetworkStream.EndRead(IAsyncResultasyncResult)} System.Exception {System.Net.Sockets.SocketException}und der muss die Info doch auch irgendwo her haben. Eincatch (SocketException ex){ ... }funktioniert überigens überhaupt nicht, wird niemals angesprungen.Stattdessen wird das Progamm einfach sang- und klanglos beendet.Fazit: Das funktioniert alles nur scheinbar, aber nicht wirklich.Gruß,Hajü