private void ReadMessageCallback(IAsyncResult ar)
        {
            try
            {
                // Debug.WriteLine("ReadMessageCallback");
                var state      = (MessageObject)ar.AsyncState;
                var handler    = state.Client;
                var bytesCount = handler.Client.EndReceive(ar);
                if (bytesCount > 0)
                {
                    state.BytesCounter += bytesCount;
                    if (state.BytesCounter == state.MessageBuffer.Length)
                    {                             //done receiving message
                        _BeginRead(state.Client); //start over again

                        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
                        {
                            aes.KeySize = handler._MySessionKey.Length * 8;
                            aes.Key     = handler._MySessionKey;
                            var iv = new byte[MessageObject.IVSize];
                            Buffer.BlockCopy(state.HeaderBuffer, 0, iv, 0, MessageObject.IVSize);

                            aes.IV      = iv;
                            aes.Mode    = CipherMode.CBC;
                            aes.Padding = PaddingMode.PKCS7;

                            using (ICryptoTransform decrypt = aes.CreateDecryptor())
                            {
                                var arrybuf = decrypt.TransformFinalBlock(state.MessageBuffer, 0, state.MessageBuffer.Length);
                                Received_Total            += state.MessageBuffer.Length;
                                _Bytes_Received_in_Window += state.MessageBuffer.Length;
                                UpdateCounters();


                                if (handler.MessageReceivedEvent != null)
                                {
                                    handler.MessageReceivedEvent(state.Client, Tcp_Message.FromBuffer(arrybuf));
                                }
                                // Debug.WriteLine("ReadMessageCallback DONE");
                            }
                        }
                    }
                    else
                    {
                        handler.Client.BeginReceive(state.MessageBuffer, state.BytesCounter, state.MessageBuffer.Length - state.BytesCounter, 0, new AsyncCallback(ReadMessageCallback), state);
                    }
                }
            } catch (Exception e)
            {
                if (DisconnectEvent != null)
                {
                    DisconnectEvent(this);
                }
                Debug.WriteLine(e.Message);
            }
        }