private bool TryDeserializeLargePacket(int len)
{
var leftLen = _receiveLargeBuffer.Value.Count - _receiveLargeLength;
Array.Copy(_receiveBuffer, 0,
_receiveLargeBuffer.Value.Array,
_receiveLargeBuffer.Value.Offset + _receiveLargeLength,
Math.Min(leftLen, len));
if (leftLen > len)
{
// 데이터를 더 받아야 한다
_receiveLargeLength += len;
}
else
{
// 다 받았으니 Deserialize
var stream = new MemoryStream(
_receiveLargeBuffer.Value.Array,
_receiveLargeBuffer.Value.Offset,
_receiveLargeBuffer.Value.Count,
false, true);
object packet;
try
{
packet = Settings.PacketSerializer.Deserialize(stream);
}
catch (Exception e)
{
if (_logger != null)
{
var bytes = Convert.ToBase64String(_receiveLargeBuffer.Value.Array,
_receiveLargeBuffer.Value.Offset,
Math.Min(_receiveLargeBuffer.Value.Count, 2048));
_logger.WarnFormat("Exception raised in deserializing: " + bytes, e);
}
HandleSerializeError(SerializeError.DeserializeExceptionRaised);
return false;
}
if (packet == null)
{
HandleSerializeError(SerializeError.DeserializeNoPacket);
return false;
}
_lastReceiveTime = DateTime.UtcNow;
if (Received != null)
Received(this, packet);
var extraLen = len - leftLen;
if (extraLen > 0)
{
Array.Copy(_receiveBuffer, leftLen,
_receiveBuffer, 0, extraLen);
}
_receiveLength = extraLen;
_receiveLargeBuffer = null;
}
return true;
}