2017-11-13 4 views
0

Ich erhalte SocketError.ConnectionReset immer dann, wenn ich versuche, ein Paket von meinem Server über SendAsync an einen Client zu senden. Das wirklich frustrierende ist, dass das Paket mit einem anderen Paket identisch ist, das einwandfrei funktioniert, außer dem Klassennamen. Ich habe gelesen, dass die einzige Möglichkeit, die Ursache zu ermitteln, darin besteht, den Netzwerkverkehr zu überwachen, gibt es einen einfacheren Weg? Ich bin nicht vertraut mit diesem Prozess, wenn das der einzige Weg ist, wenn Sie irgendwelche Tipps haben, dies zu tun, teilen Sie sie bitte!Ursache von ConnectionReset finden

Hier ist der Code, den ich zur Zeit, das Paket zu senden verwenden:

 private bool StartSend() 
    { 
     Log.Net("[" + ConnectionId + "] StartSend m_iSendBufferLength=" + m_iSendBufferLength + " m_iBytesSent=" + m_iBytesSent); 

     Int32 bytesToSend = m_iSendBufferLength - m_iBytesSent; 

     if (bytesToSend > PSSocketServer.SOCKET_OP_BUFFER_LENGTH) 
     { 
      bytesToSend = PSSocketServer.SOCKET_OP_BUFFER_LENGTH; 
     } 

     try 
     { 
      m_SendAsyncEventArgs.SetBuffer(m_SendAsyncEventArgs.Offset, bytesToSend); 
     } 
     catch (Exception exc) 
     { 
      Log.Error(exc.ToString()); 
      return false; 
     } 

     Buffer.BlockCopy(m_SendBuffer, m_iBytesSent, 
         m_SendAsyncEventArgs.Buffer, m_SendAsyncEventArgs.Offset, 
         bytesToSend); 

     try 
     { 
      Log.Net("[" + ConnectionId + "] SendAsync m_iSendBufferLength=" + m_iSendBufferLength + " m_iBytesSent=" + m_iBytesSent); 

      //post asynchronous send operation 
      bool willRaiseEvent = 
       ConnectionSocket.SendAsync(m_SendAsyncEventArgs); 

      if (!willRaiseEvent) 
      { 
       return ProcessSend(); 
      } 
     } 
     catch (Exception e) 
     { 
      Log.Error("Caught Exception '" + e.Message + " Starting PSConnection SendAsync"); 
      return false; 
     } 
     return true; 
    } 

Wenn ich Setup eine neue Verbindung, ich die SocketAsyncEventArgs haben, für senden & erhalten. Gleich nach dem SendAsync() getroffen wird, die ProcessSend Funktion weiter unten genannt wird, und die m_SendAsyncEventArgs.SocketError ist ConnectionReset:

   public bool ProcessSend() 
    { 
     m_iBytesSent += m_SendAsyncEventArgs.BytesTransferred; 

     Log.Net("[" + ConnectionId + "] ProcessSend BytesTransferred=" + m_SendAsyncEventArgs.BytesTransferred + " m_iBytesSent=" + m_iBytesSent); 

     if (m_SendAsyncEventArgs.SocketError != SocketError.Success) 
     { 
      Log.Error("Socket Error '" + m_SendAsyncEventArgs.SocketError.ToString() + 
       "' in PSConnection ProcessSend. Connection ID: " + ConnectionId); 
      return false; 
     } 

     if (m_iBytesSent == m_iSendBufferLength) // this packet is finished sending 
     { 
      m_SendQueueMutex.WaitOne(); 
      ResetSendVars(); 
      m_SendQueueMutex.ReleaseMutex(); 
      CheckStartSend(); 
     } 
     else // still more of this clump to send 
     { 
      if (ConnectionSocket != null) 
      { 
       return StartSend(); 
      } 
      else 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

Auch eine interessante paar Informationen, die helfen können: wenn ich nur drei Int32 der Serialisierung, das Paket wird gesendet Gut, keine ConnectionReset, wenn ich ein weiteres Int32 hinzufüge, tritt der Fehler auf.

+0

Ich habe den Post bearbeitet, um den Sendungscode des Pakets zu enthalten. Ich suche hauptsächlich nach Methoden, um die Quelle von ConnectionReset aufzuspüren, da ich annahm, dass es nicht debuggbar war. Ich habe zu Beginn keinen Code gepostet. –

+0

Können Sie den Fehler auch anzeigen? Fühlen Sie sich frei, mich zu pingen, wenn Sie es bearbeiten. –

+0

@YvetteColomb Ich habe den Beitrag aktualisiert, um weitere Informationen zum Fehler zu erhalten, danke! –

Antwort

0

Ich habe herausgefunden, was das Problem war. Der Client wurde aufgrund einer Ausnahme, die beim Empfang des von unserem Server gesendeten Pakets ausgelöst wurde, getrennt. Ich konzentrierte mich auf die Server-Seite, aber das Problem lag auf dem Client.

Verwandte Themen