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.
InformationsquelleAutor user767428 | 2011-05-24
Schreibe einen Kommentar