Akka.Interfaced.SlimSocket.Client.TcpConnection.ProcessRecvCallback C# (CSharp) Method

ProcessRecvCallback() private method

private ProcessRecvCallback ( IAsyncResult ar ) : void
ar IAsyncResult
return void
        private void ProcessRecvCallback(IAsyncResult ar)
        {
            try
            {
                int readed = _client.GetStream().EndRead(ar);
                if (readed == 0)
                {
                    _logger?.Info("ProcessRecvCallback readed == 0");
                    Close();
                    return;
                }
                _recvBufLen += readed;
            }
            catch (SocketException e)
            {
                _logger?.Info("ProcessRecvCallback Exception", e);
                Close((int)e.SocketErrorCode);
                return;
            }
            catch (Exception e)
            {
                _logger?.Info("ProcessRecvCallback Exception", e);
                Close();
                return;
            }

            while (true)
            {
                using (var ms = new MemoryStream(_recvBuf, 0, _recvBufLen, false, true))
                {
                    var length = _packetSerializer.PeekLength(ms);
                    if (length > _recvBuf.Length)
                    {
                        _logger?.ErrorFormat("ProcessRecvCallback got too large packet. Length={0}", length);
                        Close();
                        return;
                    }
                    if (length == 0 || _recvBufLen < length)
                        break;

                    try
                    {
                        var packet = _packetSerializer.Deserialize(ms);
                        _lastReceiveTime = DateTime.UtcNow;
                        if (Received != null)
                            Received(this, packet);
                    }
                    catch (Exception e)
                    {
                        _logger?.Error("Deserialize Error", e);
                        Close();
                        return;
                    }

                    int leftLen = _recvBufLen - length;
                    if (leftLen > 0)
                    {
                        Array.Copy(_recvBuf, length, _recvBuf, 0, leftLen);
                        _recvBufLen = leftLen;
                    }
                    else
                    {
                        _recvBufLen = 0;
                    }
                }
            }

            ProcessRecv();
        }
    }