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();
}
}
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 –