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); } }