0
我的服務器程序,部署在很多產品環境上運行良好,在我們所期望的不運行的機器上購買。c#SslStream.EndRead返回零字節
在這個機器上,當我們調用SslStream.BeginRead,那麼當SslStream.EndRead調用0的回報,如果我們不關閉流,並再次調用SslStream,有扔一個例外。
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和它的依賴都good.when我從客戶端readed第一個數據包,然後不從流中讀取,登錄操作完成後,併發送登錄信息給客戶。經過上述操作,然後開始閱讀,並且正常運行。購買這個黑客看起來很直接 –