2016-07-22 13 views
0

Mein Server-Programm, Einsatz in vielen Produktumgebung gut laufen, kaufen auf einer der Maschine, die nicht so läuft wie wir erwarten.C# SslStream.EndRead Rückgabe Null Bytes

Auf dieser Maschine, wenn wir SslStream.BeginRead nennen, dann, wenn SslStream.EndRead mit 0 Rückkehr aufgerufen, wenn wir wieder die SslStream nicht den Stream schließen, und rufen Sie gibt eine Ausnahme throwed ist.

private void Read() 
    { 
     try 
     { 
      if (this._IsClosed) 
      { 
       return; 
      } 
      this._Stream.BeginRead(this._Buffer, 0,  BufferManager.Default.OutterReadBufferSize, this.EndRead, null); 
     } 
     catch (Exception ex) 
     { 
      _Logger.WarnFormat("Begin Read, session:{0}, {1}", this._Id, ex); 
      this.Close(); 
     } 
    } 





private void EndReadTaskAction(object ar) 
    { 
     try 
     { 
      int len = this._Stream.EndRead((IAsyncResult)ar); 
      int used = 0; 
      if (len <= 0) 
      { 
       _Logger.WarnFormat("EndReadTaskAction len less or equal zero, len={0}, session={1}", len, _Id); 
       this.Close(); 
       return; 
      } 

      if (this._HasPartialPacket) 
      { 
       if (this._PartialReadedLenth < PacketConstants.HeadLength) 
       { 
        int needToRead = PacketConstants.HeadLength - this._PartialReadedLenth; 
        if (needToRead > len) 
        { 
         Buffer.BlockCopy(this._Buffer, used, this._Buffer, GetCurrentPartialReadIndex(), len); 
         this._PartialReadedLenth += len; 
         Read(); 
         return; 
        } 
        Buffer.BlockCopy(this._Buffer, used, this._Buffer, GetCurrentPartialReadIndex(), needToRead); 
        len -= needToRead; 
        used += needToRead; 
        this._PartialReadedLenth += needToRead; 
       } 
       int packetLength = PacketHelper.GetPacketLength(this._Buffer, this._PartialReadIndex); 
       int howMuchNeedToRead = packetLength - this._PartialReadedLenth; 
       if (howMuchNeedToRead > len) 
       { 
        Buffer.BlockCopy(this._Buffer, used, this._Buffer, GetCurrentPartialReadIndex(), len); 
        this._PartialReadedLenth += len; 
        Read(); 
        return; 
       } 
       Buffer.BlockCopy(this._Buffer, used, this._Buffer, GetCurrentPartialReadIndex(), howMuchNeedToRead); 
       ProcessPackage(this._Buffer, this._PartialReadIndex, packetLength); 
       len -= howMuchNeedToRead; 
       used += howMuchNeedToRead; 
      } 
      this._HasPartialPacket = false; 
      this._PartialReadedLenth = 0; 
      while (true) 
      { 
       if (len <= 0) 
       { 
        break; 
       } 

       if (len < PacketConstants.HeadLength) 
       { 
        Buffer.BlockCopy(this._Buffer, used, this._Buffer, this._PartialReadIndex, len); 
        this._PartialReadedLenth = len; 
        this._HasPartialPacket = true; 
        break; 
       } 
       int packetLength = PacketHelper.GetPacketLength(this._Buffer, used); 
       if (len < packetLength) 
       { 
        Buffer.BlockCopy(this._Buffer, used, this._Buffer, this._PartialReadIndex, len); 
        this._PartialReadedLenth = len; 
        this._HasPartialPacket = true; 
        break; 
       } 
       ProcessPackage(this._Buffer, used, packetLength); 
       used += packetLength; 
       len -= packetLength; 
      } 
      if (_isBeginRead) 
      { 
       Read(); 
      } 
     } 
     catch (Exception ex) 
     { 
      _Logger.WarnFormat("End read, session:{0}, {1}", this._Id, ex); 
      this.Close(); 
     } 
    } 

Antwort

0

Sie sagen auf dem Server im Einsatz haben Sie kein Problem und in der neuen Maschine haben Sie ein Problem, überprüfen Sie bitte alle DLLs, wenn include und seine Abhängigkeiten, .net Framework Laufzeit.

Hoffe, es hilft ..

+0

DLL und ihre Abhängigkeiten sind alle good.when ich das erste Paket vom Client readed, dann nicht aus dem Stream lesen Sie nach dem Login-Vorgang abgeschlossen, und die Anmeldeinformationen senden an den Client. Nach den oben genannten Operationen, dann starten Sie lesen, und es läuft normal.Kaufen Sie diesen Hack sieht strangly –