private bool TryDeserializeNormalPacket(int len)
{
_receiveLength += len;
var stream = new MemoryStream(_receiveBuffer, 0, _receiveLength, false, true);
var readOffset = 0;
while (true)
{
var packetLen = Settings.PacketSerializer.PeekLength(stream);
if (packetLen == 0 || _receiveLength - readOffset < packetLen)
{
// 패킷 크기가 최대 크기보다 큰지 확인
if (packetLen > Settings.ReceiveBufferMaxSize)
{
HandleSerializeError(SerializeError.DeserializeSizeExceeded);
return false;
}
_receiveLength -= readOffset;
if (packetLen > _receiveBuffer.Length)
{
// 패킷이 기본 버퍼보다 크기가 크면 Large 모드 전환
_receiveLargeBuffer = new ArraySegment<byte>(new byte[packetLen]);
_receiveLargeLength = _receiveLength;
Array.Copy(_receiveBuffer, readOffset,
_receiveLargeBuffer.Value.Array,
_receiveLargeBuffer.Value.Offset,
_receiveLength);
}
else if (_receiveLength > 0)
{
// 버퍼에 남은 데이터가 있으면 맨 앞으로 이동
Array.Copy(_receiveBuffer, readOffset,
_receiveBuffer, 0, _receiveLength);
}
break;
}
// 버퍼에서 패킷 재구성해내기
object packet;
try
{
packet = Settings.PacketSerializer.Deserialize(stream);
}
catch (Exception e)
{
if (_logger != null)
{
var bytes = Convert.ToBase64String(_receiveBuffer, 0, Math.Min(_receiveLength, 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);
readOffset += packetLen;
}
return true;
}