Die TCP-Socket-Verbindungen
Ich habe einen windows-service, der unter anderem wartet auf ankommende Daten von einem remote-Gerät mit Hilfe der .NET-System.Net.Sockets-Bibliothek. Das Beispiel unten hat nur ein remote-Gerät pushen von Daten alle 60 Sekunden.
Jeder so oft, dieser Dienst wird angehalten und eine Meldung (siehe unten), erscheint in der windows-logs des Servers.
The process was terminated due to an unhandled exception.
Exception Info: System.Net.Sockets.SocketException Stack:
at System.Net.Sockets.Socket.EndReceive(System.IAsyncResult)
at Uk.Co.RCID.MoteServer.Server.SocketListener.ReceiveCallback(System.IAsyncResult)
at System.Net.LazyAsyncResult.Complete(IntPtr)
at System.Net.ContextAwareResult.CompleteCallback(System.Object)
at System.Threading.ExecutionContext.runTryCode(System.Object)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Net.ContextAwareResult.Complete(IntPtr) at System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)
at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
Dass passte der Zeitpunkt für dieses Ereignis mit meinem letzten log-Anweisung habe ich entdeckt, dass dies eine schwerwiegende Ausnahme tritt auf, wenn das remote-Gerät eine Verbindung zum service zweimal in kurzer Zeit (in der Regel verbindet es alle 60 Sekunden push-Daten). Hier ist mein letzter log-Anweisung aus, bevor das system abstürzt.
2011-05-20 13:39:19,545 [6] INFO Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - Waiting for a connection...
2011-05-20 13:39:19,545 [10] INFO Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - Connection established on [10.64.128.60:11000]
2011-05-20 13:40:20,982 [6] INFO Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - Waiting for a connection...
2011-05-20 13:40:20,982 [5] INFO Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - Connection established on [10.64.128.60:11000]
Ohne es zu wollen, veröffentlichen Sie den source-code (ich kann das arrangieren, wenn nötig, aber müssen entfernen bestimmter details), wird der socket hören-code basiert auf diesem Beispiel.
http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx
Jede Hilfe wird sehr geschätzt.
Hallo Allerseits,
Danke für Sie Antworten.
Ich fügte hinzu, mehr logging und exception handling in der ReceiveCallback
Funktion und Folgendes gefunden, in meiner log-Datei heute morgen...
2011-05-25 04:52:26,816 [5] INFO Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - Waiting for a connection...
2011-05-25 04:52:26,816 [10] INFO Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - Connection established on [10.64.128.60:11000]
2011-05-25 04:53:26,841 [10] WARN Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - SocketException thrown in ReceiveCallback
2011-05-25 04:53:26,841 [10] WARN Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - ErrorCode: [10054]
2011-05-25 04:53:26,841 [10] WARN Uk.Co.RCID.MoteServer.Server.SocketListener [(null)] - System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) at Uk.Co.RCID.MoteServer.Server.SocketListener.ReceiveCallback(IAsyncResult ar)
So, der Schlüssel ist (wie hervorgehoben, einige der Antworten oben), fangen die Ausnahmen in der ReceiveCallback
Funktion und entscheiden Sie, ob Sie stark genug ist, zu töten, Ihre Anwendung.
- Gibt es eine innere Ausnahme in der
InnerException
- Eigenschaft der Ausnahme, die Sie fangen? Ich glaube, es gibt so etwas immer geworfen in Ihrem code, wo Sie den Empfang der Daten aus dem socket. - Leider habe ich nicht über diese Informationen verfügen. Als der Fehler tritt selten auf, es wird einige Zeit dauern, um neu zu erstellen die problem mit mehr Protokollierung. Ich werde versuchen, neu zu erstellen, es mit einer simulierten remote-Gerät.
Du musst angemeldet sein, um einen Kommentar abzugeben.
EndAccept und kann nicht werfen Ausnahmen, wenn ein client verbindungen fehlschlagen, um den übergang von halb offen zu vollständig offenen Zustand. Beachten Sie auch, dass es wirft einen
ObjectDisposedException
nach dem Hörer heruntergefahren, so dass Sie haben, um wirklich zu sehen, die Ausnahme und machen eine Entscheidung, was zu tun ist basierend auf dem, was falsch gelaufen ist.EndReceive
in der Regel wirft, wenn der client die Verbindung zwangsweise geschlossen, aber wieder haben Sie Blick auf die Ausnahme und machen eine Bestimmung dessen, was zu tun, basierend auf, was die exception geworfen wurde.Wenn Ihr code folgt dem Beispiel ganz eng, dann sollten Sie wirklich einen try-catch um:
int read = handler.EndReceive(ar);
in der
ReceiveCallback
- Funktion, da könnte es etwas so einfaches wie die socket-Verbindung immer geschlossen, während Sie versuchen, zu erhalten.Eher als Tötung der Prozess wahrscheinlich können Sie einfach weiter.
Sollten Sie immer
catch (Exception err)
alle callback-Methoden. TUN melden die Ausnahme.Der Grund dafür ist, dass alle unbehandelten Ausnahmen, die in jedem anderen thread als dem Haupt-thread beenden Ihre Anwendung.
Behandeln Sie jede Ausnahme in der socket-callbacks als wenn der client getrennt wurde. Man könnte natürlich fatal Ausnahmen wie
OutOfMemoryException
sollte beenden Ihre Anwendung. Aber in den meisten Fällen ist es unwahrscheinlich.Ist die erste Sache, die ich tun würde, überprüfen Sie den Wert des
ErrorCode
Eigenschaft in die geworfenSocketException
. Look-up diesen Wert im winsock-Fehler-code-Liste für einige Hinweise zu dem, was vielleicht falsch läuft.Wenn Sie den Fehlercode dann könnte ich vielleicht weiter helfen.