/// <summary>
        /// Send Service Initialize Command respose on optimal path if exception occured only for newer clients 4610.
        /// Backward compability handled for older version client.
        /// </summary>
        /// <param name="unOptBuffer"></param>
        /// <returns></returns>
        private IList GetOptimizedResponse(IList unOptBuffer)
        {
            if (cmdInfo.clientVersion < 4610)
            {
                return(unOptBuffer);
            }

            using (ClusteredMemoryStream stream = new ClusteredMemoryStream())
            {
                byte[] dataSzBytes = new byte[ConnectionManager.MessageSizeHeader];
                stream.Write(dataSzBytes, 0, ConnectionManager.MessageSizeHeader);

                int len = 0;

                foreach (byte[] buffBytes in unOptBuffer)
                {
                    stream.Write(buffBytes, 0, buffBytes.Length);
                    len += buffBytes.Length;
                }

                byte[] lengthBytes = HelperFxn.ToBytes(len.ToString());

                stream.Seek(0, SeekOrigin.Begin);
                stream.Write(lengthBytes, 0, lengthBytes.Length);

                return(stream.GetInternalBuffer());
            }
        }
Example #2
0
        /// <summary>
        /// Reads a single single response from the stream and processes it.
        /// </summary>
        /// <param name="stream"></param>
        private void ProcessResponse(byte[] cmdBytes)
        {
            Response response;

            using (Stream tempStream = new ClusteredMemoryStream(cmdBytes))
            {
                response = ProtoBuf.Serializer.Deserialize <Response>(tempStream);
            }

            CommandResponse cmdRespose = null;

            if (response != null)
            {
                cmdRespose         = new CommandResponse(false, new Address());
                cmdRespose.CacheId = _cacheId;
                cmdRespose.Result  = response;
            }

            if (_perfStatsColl.IsEnabled)
            {
                _perfStatsColl.IncrementClientResponsesPerSecStats(1);
            }

            if (cmdRespose != null)
            {
                _container.ProcessResponse(cmdRespose, _serverAddress);
            }
        }
Example #3
0
            public static string DecryptText(string encryptedText)
            {
                byte[] decryptedBytes;
                byte[] bytesToBeDecrypted = Convert.FromBase64String(encryptedText);
                byte[] saltBytes          = { 1, 2, 3, 4, 5, 6, 7, 8 };

                using (var ms = new ClusteredMemoryStream())
                {
                    using (var aes = new RijndaelManaged())
                    {
                        aes.KeySize   = 256;
                        aes.BlockSize = 128;
                        var encryptionKeyBytes = Encoding.UTF8.GetBytes(s_iv);
                        Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(encryptionKeyBytes, saltBytes, 1000);
                        aes.Key = key.GetBytes(aes.KeySize / 8);
                        aes.IV  = key.GetBytes(aes.BlockSize / 8);

                        aes.Mode = CipherMode.CBC;

                        using (var cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                            cs.Close();
                        }
                        decryptedBytes = ms.ToArray();
                    }
                }
                return(Encoding.UTF8.GetString(decryptedBytes));
            }
Example #4
0
 /// <summary>
 /// Deserializes the binary representation of an object.
 /// </summary>
 /// <param name="buffer">binary representation of the object</param>
 /// <returns>deserialized object</returns>
 static public object FromByteBuffer(byte[] buffer, string cacheContext)
 {
     using (var stream = new ClusteredMemoryStream(buffer))
     {
         return(Deserialize(stream, cacheContext));
     }
 }
        private void InitializePerviouslyStoredCollections()
        {
            //needed to ensure that internalMetadataCollection exists so that argument exception is not thrown by LMDB.
            _collectionTable[METADATA_COLLECTION] = new LMDBCollection(CreateCollectionInternal(METADATA_COLLECTION, typeof(string)));
            //ITransaction transaction = BeginTransaction(null, true);
            StorageResult <byte[]> result = GetDocument <string, byte[]>(METADATA_COLLECTION, "collections");

            if (result.Document != null)
            {
                Dictionary <string, LMDBCollection> collectionList;
                using (ClusteredMemoryStream ms = new ClusteredMemoryStream(result.Document))
                {
                    using (CompactReader reader = new CompactBinaryReader(ms))
                    {
                        collectionList = SerializationUtility.DeserializeDictionary <string, LMDBCollection>(reader);
                    }
                }
                foreach (var col in collectionList)
                {
                    CreateCollection(col.Key, null, null);
                    if (LoggerManager.Instance.StorageLogger != null && LoggerManager.Instance.StorageLogger.IsInfoEnabled)
                    {
                        LoggerManager.Instance.StorageLogger.Info("LMDB.Initialize", "Previously stored collection :" + col.Key + " initialized successfully. ");
                    }
                    _collectionTable[col.Key].Stats.DataSize      = col.Value.Stats.DataSize;
                    _collectionTable[col.Key].Stats.DocumentCount = col.Value.Stats.DocumentCount;
                }
            }
        }
Example #6
0
 /// <summary>
 /// Serializes an object and returns its binary representation.
 /// </summary>
 /// <param name="graph">object to serialize</param>
 /// <returns>binary form of object</returns>
 static public byte[] ToByteBuffer(object graph, string cacheContext)
 {
     using (var stream = new ClusteredMemoryStream())
     {
         Serialize(stream, graph, cacheContext);
         return(stream.ToArray());
     }
 }
Example #7
0
        /// <summary>
        /// Reads a single single response from the stream and processes it.
        /// </summary>
        /// <param name="stream"></param>
        private void ProcessResponse(Stream stream)
        {
            Response response;
            long     requestId = 0;

            if (WriteRequestIdInResponse)
            {
                byte[] requestIdBytes = new byte[sizeof(long)];
                stream.Read(requestIdBytes, 0, requestIdBytes.Length);
                requestId = BitConverter.ToInt64(requestIdBytes, 0);
            }

            byte[] responseTypeBytes = new byte[2];
            stream.Read(responseTypeBytes, 0, responseTypeBytes.Length);
            Response.Type responseType = (Response.Type)BitConverter.ToInt16(responseTypeBytes, 0);

            //Reading  a response's header...
            byte[] cmdSzBytes = new byte[CmdSizeHolderBytesCount];
            stream.Read(cmdSzBytes, 0, CmdSizeHolderBytesCount);
            int commandSize = HelperFxn.ToInt32(cmdSzBytes, 0, CmdSizeHolderBytesCount);

            byte[] cmdBytes = new byte[commandSize];
            stream.Read(cmdBytes, 0, commandSize);

            CommandResponse cmdRespose = new CommandResponse(false, new Address());

            cmdRespose.CacheId = _cacheId;
            cmdRespose.Src     = this.ServerAddress;

            if (WriteRequestIdInResponse)
            {
                cmdRespose.NeedsDeserialization = true;
                cmdRespose.RequestId            = requestId;
                cmdRespose.SerializedResponse   = cmdBytes;
                cmdRespose.Type = responseType;
            }
            else
            {
                using (Stream tempStream = new ClusteredMemoryStream(cmdBytes))
                    response = ResponseHelper.DeserializeResponse(responseType, tempStream);

                cmdRespose.NeedsDeserialization = false;
                if (response != null)
                {
                    cmdRespose.Result = response;
                }
            }

            if (_perfStatsColl.IsEnabled)
            {
                _perfStatsColl.IncrementClientResponsesPerSecStats(1);
            }

            if (cmdRespose != null)
            {
                _container.ProcessResponse(cmdRespose, _serverAddress);
            }
        }
Example #8
0
        private void RecieveThread(object clientSocket)
        {
            while (true)
            {
                try
                {
                    byte[] cmdBytes;
                    Socket client = null;

                    if (clientSocket != null && clientSocket is Socket)
                    {
                        client = clientSocket as Socket;
                    }

                    cmdBytes = AssureRecieve(client, false);

                    using (Stream tempStream = new ClusteredMemoryStream(cmdBytes))
                    {
                        tempStream.Position = 0;
                        while (tempStream.Position < tempStream.Length)
                        {
                            ProcessResponse(tempStream);
                        }
                    }
                }
                catch (SocketException se)
                {
                    OnConnectionBroken(se, ExType.Socket);
                    break;
                }
                catch (IOException ie)
                {
                    //System.IOException is going to thrown in the case SslStream when the connection gets forcibly closed.
                    //Thus we are going to handle it as a SocketException....
                    OnConnectionBroken(ie, ExType.Socket);
                    break;
                }
                catch (ConnectionException ce)
                {
                    OnConnectionBroken(ce, ExType.Connection);
                    break;
                }
                catch (ThreadAbortException te)
                {
                    OnConnectionBroken(te, ExType.Abort);
                    break;
                }
                catch (ThreadInterruptedException tae)
                {
                    OnConnectionBroken(tae, ExType.Interrupt);
                    break;
                }
                catch (Exception e)
                {
                    OnConnectionBroken(e, ExType.General);
                }
            }
        }
Example #9
0
        internal static IList serializeMessage(Message msg)
        {
            int len = 0;

            byte[]    buffie;
            FlagsByte flags = new FlagsByte();

            msg.Dest  = null;
            msg.Dests = null;

            RequestCorrelatorHDR rqHeader = (RequestCorrelatorHDR)msg.getHeader(HeaderType.REQUEST_COORELATOR);

            if (rqHeader != null)
            {
                rqHeader.serializeFlag = false;
            }

            ClusteredMemoryStream stmOut = new ClusteredMemoryStream();

            stmOut.Write(Util.WriteInt32(len), 0, 4);
            stmOut.Write(Util.WriteInt32(len), 0, 4);

            if (msg.IsUserMsg)
            {
                BinaryWriter msgWriter = new BinaryWriter(stmOut, new UTF8Encoding(true));
                flags.SetOn(FlagsByte.Flag.TRANS);
                msgWriter.Write(flags.DataByte);
                msg.SerializeLocal(msgWriter);
            }
            else
            {
                flags.SetOff(FlagsByte.Flag.TRANS);
                stmOut.WriteByte(flags.DataByte);
                CompactBinaryFormatter.Serialize(stmOut, msg, null, false);
            }

            len = (int)stmOut.Position - 4;

            int payloadLength = 0;

            // the user payload size. payload is passed on untill finally send on the socket.
            if (msg.Payload != null)
            {
                for (int i = 0; i < msg.Payload.Length; i++)
                {
                    payloadLength += ((byte[])msg.Payload.GetValue(i)).Length;
                }
                len += payloadLength;
            }

            stmOut.Position = 0;
            stmOut.Write(Util.WriteInt32(len), 0, 4);
            stmOut.Write(Util.WriteInt32(len - 4 - payloadLength), 0, 4);

            return(stmOut.GetInternalBuffer());
        }
Example #10
0
        /// <summary>
        /// Decompresses a stream of compressed bytes using DeflateStream
        /// </summary>
        /// <param name="inputStream">A Seekable Stream</param>
        /// <returns></returns>
        public static ClusteredMemoryStream Decompress(Stream inputStream)
        {
            var ms = new ClusteredMemoryStream();

            using (var decompressor = new DeflateStream(inputStream, CompressionMode.Decompress, true))
            {
                decompressor.CopyTo(ms);
                inputStream.Dispose();
            }
            ms.Seek(0, SeekOrigin.Begin);
            return(ms);
        }
Example #11
0
            // Encrypt the string.
            public static byte[] Encrypt(string PlainText)
            {
                try
                {
                    if (PlainText == null)
                    {
                        return(null);
                    }
                    s_des = new TripleDESCryptoServiceProvider();
                    int block = s_des.BlockSize;
                    int j     = s_des.KeySize;
                    //s_iv = RandomString(block);


                    byte[] k  = ConvertStringToByteArray(s_key);
                    byte[] iv = ConvertStringToByteArray(s_iv);
                    //s_des.Key = ConvertStringToByteArray(s_key);
                    //s_des.IV = ConvertStringToByteArray(s_iv);

                    // Create a memory stream.
                    ClusteredMemoryStream ms = new ClusteredMemoryStream();

                    // Create a CryptoStream using the memory stream and the
                    // CSP DES key.
                    CryptoStream encStream = new CryptoStream(ms, s_des.CreateEncryptor(k, iv), CryptoStreamMode.Write);

                    // Create a StreamWriter to write a string
                    // to the stream.
                    StreamWriter sw = new StreamWriter(encStream);

                    // Write the plaintext to the stream.
                    sw.WriteLine(PlainText);

                    // Close the StreamWriter and CryptoStream.
                    sw.Close();
                    encStream.Close();

                    // Get an array of bytes that represents
                    // the memory stream.
                    byte[] buffer = ms.ToArray();

                    // Close the memory stream.
                    ms.Close();

                    // Return the encrypted byte array.
                    return(buffer);
                }
                catch (Exception exception)
                {
                    throw exception;
                }
                return(null);
            }
Example #12
0
        private JSONDocument DeserializeDocument(byte[] data)
        {
            var stream = new ClusteredMemoryStream(data);
            int header = stream.ReadByte();

            if ((header & (long)PersistenceBits.Compressed) == (decimal)PersistenceBits.Compressed)
            {
                stream = CompressionUtil.Decompress(stream);
            }
            var document = JSONDocument.Deserialize(stream);// CompactBinaryFormatter.Deserialize(stream, string.Empty);

            stream.Dispose();
            return(document as JSONDocument);
        }
Example #13
0
        public bool SendMessage(object message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            //first serialize the message using channel formatter
            byte[] serailizedMessage = _formatter.Serialize(message);

            byte[] msgLength = UTF8Encoding.UTF8.GetBytes(serailizedMessage.Length.ToString());

            //message is written in a specific order as expected by Socket server
            ClusteredMemoryStream stream = new ClusteredMemoryStream();

            //stream.Position = 20;//skip discarding buffer
            stream.Write(msgLength, 0, msgLength.Length);
            stream.Position = 10;
            stream.Write(serailizedMessage, 0, serailizedMessage.Length);

            byte[] finalBuffer = stream.ToArray();
            stream.Close();

            try
            {
                if (EnsureConnected())
                {
                    try
                    {
                        _connection.Send(finalBuffer, 0, finalBuffer.Length);
                        return(true);
                    }
                    catch (ConnectionException)
                    {
                        if (EnsureConnected())
                        {
                            _connection.Send(finalBuffer, 0, finalBuffer.Length);
                            return(true);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new ChannelException(e.Message, e);
            }

            return(false);
        }
Example #14
0
        private void DeserializeRawResponsesIfPresent()
        {
            if (_rawResponses != null && _rawResponses.Count > 0)
            {
                for (int i = 0; i < _rawResponses.Count; i++)
                {
                    CommandResponse respnse = _rawResponses[i];
                    using (Stream tempStream = new ClusteredMemoryStream(respnse.SerializedResponse))
                        respnse.Result = ResponseHelper.DeserializeResponse(respnse.Type, tempStream);

                    respnse.NeedsDeserialization = false;
                    AddResponse(respnse.Src, respnse);
                }
                _rawResponses.Clear();
            }
        }
Example #15
0
        public static ClusteredArrayList SerializeResponse(Alachisoft.NCache.Common.Protobuf.ManagementResponse command)
        {
            using (ClusteredMemoryStream stream = new ClusteredMemoryStream())
            {
                //TODO
                byte[] size = new byte[10];
                stream.Write(size, 0, size.Length);

                Serializer.Serialize <Alachisoft.NCache.Common.Protobuf.ManagementResponse>(stream, command);
                int messageLen = (int)stream.Length - size.Length;

                size            = UTF8Encoding.UTF8.GetBytes(messageLen.ToString());
                stream.Position = 0;
                stream.Write(size, 0, size.Length);
                ClusteredArrayList byteList = stream.GetInternalBuffer();

                return(byteList);
            }
        }
Example #16
0
            /// <summary>
            /// Encrypt user provided key with the default key stored; This key is obfuscated
            /// </summary>
            /// <param name="key">Key</param>
            /// <returns>encrypted string</returns>
            internal static byte[] EncryptData(byte[] data)
            {
                try
                {
                    //byte[] data = ASCIIEncoding.ASCII.GetBytes(key);
                    s_des = new TripleDESCryptoServiceProvider();
                    int    i  = s_des.BlockSize;
                    int    j  = s_des.KeySize;
                    byte[] k  = ConvertStringToByteArray(s_key);
                    byte[] IV = ConvertStringToByteArray(s_iv);
                    //s_des.Key = ConvertStringToByteArray(key);
                    //s_des.IV = ConvertStringToByteArray(s_iv);

                    // Create a memory stream.
                    ClusteredMemoryStream ms = new ClusteredMemoryStream();

                    // Create a CryptoStream using the memory stream and the
                    // CSP DES key.
                    CryptoStream encStream = new CryptoStream(ms, s_des.CreateEncryptor(k, IV), CryptoStreamMode.Write);

                    encStream.Write(data, 0, data.Length);
                    encStream.FlushFinalBlock();

                    // Get an array of bytes from the
                    // MemoryStream that holds the
                    // encrypted data.
                    byte[] ret = ms.ToArray();

                    // Close the memory stream.
                    ms.Close();
                    encStream.Close();

                    // Return the encrypted byte array.

                    //string temp = Convert.ToBase64String(ret, Base64FormattingOptions.None);
                    // temp = System.Security.SecurityElement.Escape(temp);
                    return(ret);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        /// <summary>
        /// Stores the collection info to Disk, If collection is Null then stores the current Collection created
        /// </summary>
        /// <param name="collection">Store This collection along with current collections</param>
        /// <param name="transaction">provide a writer transaction to store data</param>
        private void StoreCollectionInfo(string collection, ITransaction transaction)
        {
            Dictionary <string, LMDBCollection> tobeStored = new Dictionary <string, LMDBCollection>();

            foreach (KeyValuePair <string, LMDBCollection> lmdbCollection in _collectionTable)
            {
                tobeStored.Add(lmdbCollection.Key, (LMDBCollection)lmdbCollection.Value.Clone());
            }
            if (!string.IsNullOrEmpty(collection) && !tobeStored.ContainsKey(collection))
            {
                tobeStored.Add(collection, new LMDBCollection(null));
            }
            using (ClusteredMemoryStream stream = new ClusteredMemoryStream())
            {
                using (CompactWriter writer = new CompactBinaryWriter(stream))
                {
                    SerializationUtility.SerializeDictionary <string, LMDBCollection>(tobeStored, writer);
                    UpdateDocumentInternal(transaction, METADATA_COLLECTION, "collections", stream.ToArray());
                }
            }
        }
Example #18
0
        public static object DeserailizeResponse(object response, string context)
        {
            object result = null;

            if (response is byte[])
            {
                result = CompactBinaryFormatter.FromByteBuffer((byte[])response, context);
            }
            else if (response is IList)
            {
                IList buffers = response as IList;
                ClusteredMemoryStream stream = new ClusteredMemoryStream(0);
                foreach (byte[] buffer in buffers)
                {
                    stream.Write(buffer, 0, buffer.Length);
                }
                stream.Position = 0;
                result          = CompactBinaryFormatter.Deserialize(stream, context);
            }

            return(result);
        }
Example #19
0
        private byte[] SerializeDocument(JSONDocument document)
        {
            Stream stream = new ClusteredMemoryStream();

            JSONDocument.Serialize(stream, document);
            stream.Position = 0;
            if (enableCompression)
            {
                stream = CompressionUtil.Compress(stream);
            }

            var array = new byte[stream.Length + 1];

            if (enableCompression)
            {
                array[0] |= (byte)PersistenceBits.Compressed;
            }

            stream.Read(array, 1, (int)stream.Length);
            stream.Dispose();
            return(array);
        }
Example #20
0
        /// <summary>
        /// Reads a single single response from the stream and processes it.
        /// </summary>
        /// <param name="stream"></param>
        private void ProcessResponse(Stream stream)
        {
            Response response;

            //Reading  a response's header...
            byte[] cmdSzBytes = new byte[CmdSizeHolderBytesCount];
            stream.Read(cmdSzBytes, 0, CmdSizeHolderBytesCount);
            int commandSize = HelperFxn.ToInt32(cmdSzBytes, 0, CmdSizeHolderBytesCount);

            byte[] cmdBytes = new byte[commandSize];
            stream.Read(cmdBytes, 0, commandSize);

            using (Stream tempStream = new ClusteredMemoryStream(cmdBytes))
            {
                response = ProtoBuf.Serializer.Deserialize <Response>(tempStream);
            }

            CommandResponse cmdRespose = null;

            if (response != null)
            {
                cmdRespose         = new CommandResponse(false, new Address());
                cmdRespose.CacheId = _cacheId;
                cmdRespose.Result  = response;
            }

            if (_perfStatsColl.IsEnabled)
            {
                _perfStatsColl.IncrementClientResponsesPerSecStats(1);
            }

            if (cmdRespose != null)
            {
                _container.ProcessResponse(cmdRespose, _serverAddress);
            }
        }
Example #21
0
            public static byte[] DecryptData(byte[] encodedData)
            {
                try
                {
                    // byte[] data = Convert.FromBase64String(encodedkey);
                    s_des = new TripleDESCryptoServiceProvider();
                    byte[] k  = ConvertStringToByteArray(s_key);
                    byte[] IV = ConvertStringToByteArray(s_iv);


                    // Create a memory stream to the passed buffer.
                    ClusteredMemoryStream ms = new ClusteredMemoryStream(encodedData);

                    // Create a CryptoStream using the memory stream and the
                    // CSP DES key.
                    CryptoStream encStream = new CryptoStream(ms, s_des.CreateDecryptor(k, IV), CryptoStreamMode.Read);

                    byte[] fromEncrypt = new byte[encodedData.Length];

                    // Read the decrypted data out of the crypto stream
                    // and place it into the temporary buffer.
                    int length = encStream.Read(fromEncrypt, 0, fromEncrypt.Length);

                    // Close the streams.
                    encStream.Close();
                    ms.Close();

                    byte[] ret = new byte[length];
                    Array.Copy(fromEncrypt, ret, length);
                    return(ret);//ASCIIEncoding.ASCII.GetString(ret);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
Example #22
0
        /// <summary>Removes events from mq and calls handler.down(evt) </summary>
        override public void Run()
        {
            bool connectionCloseNotified = false;

            try
            {
                ArrayList             msgList       = new ArrayList();
                byte[]                tmpBuffer     = null;
                int                   totalMsgSize  = 4;
                int                   noOfMsgs      = 0;
                int                   offset        = 8;
                bool                  resendMessage = false;
                ArrayList             msgsTobeSent  = new ArrayList();
                ClusteredMemoryStream stream        = null;
                while (!mq.Closed)
                {
                    try
                    {
                        if (resendMessage)
                        {
                            if (stream != null && stream.Length > 0)
                            {
                                peerConnection.send(stream.GetInternalBuffer(), null, totalMsgSize + 4);
                            }
                            resendMessage = false;
                            continue;
                        }
                        msgsTobeSent.Clear();
                        stream = new ClusteredMemoryStream();

                        lock (sync_lock)
                        {
                            tmpBuffer    = sendBuffer;
                            totalMsgSize = 4;
                            noOfMsgs     = 0;
                            offset       = 8;

                            stream.Seek(8, System.IO.SeekOrigin.Begin);

                            BinaryMessage bMsg = (BinaryMessage)mq.remove();
                            if (bMsg != null)
                            {
                                if (!peerConnection.IsPrimary)
                                {
                                    msgsTobeSent.Add(bMsg);
                                }

                                noOfMsgs++;
                                totalMsgSize += bMsg.Size;

                                foreach (byte[] buffer in bMsg.Buffer)
                                {
                                    stream.Write(buffer, 0, buffer.Length);
                                }
                                if (bMsg.UserPayLoad != null)
                                {
                                    byte[] buf = null;
                                    for (int i = 0; i < bMsg.UserPayLoad.Length; i++)
                                    {
                                        buf = bMsg.UserPayLoad.GetValue(i) as byte[];
                                        stream.Write(buf, 0, buf.Length);
                                        offset += buf.Length;
                                    }
                                }
                            }
                            bMsg = null;
                        }

                        byte[] bTotalLength = Util.Util.WriteInt32(totalMsgSize);
                        stream.Seek(0, System.IO.SeekOrigin.Begin);
                        stream.Write(bTotalLength, 0, bTotalLength.Length);
                        byte[] bNoOfMsgs = Util.Util.WriteInt32(noOfMsgs);
                        stream.Write(bNoOfMsgs, 0, bNoOfMsgs.Length);
                        peerConnection.send(stream.GetInternalBuffer(), null, totalMsgSize + 4);
                        stream = null;
                    }
                    catch (ExtSocketException e)
                    {
                        connectionCloseNotified = false;
                        NCacheLog.Error(Name, e.ToString());

                        if (peerConnection.IsPrimary)
                        {
                            if (peerConnection.LeavingGracefully)
                            {
                                NCacheLog.Error("DmSender.Run", peerConnection.peer_addr + " left gracefully");
                                break;
                            }
                            NCacheLog.Error("DMSender.Run", "Connection broken with " + peerConnection.peer_addr + ". node left abruptly");
                            Connection connection = peerConnection.Enclosing_Instance.Reconnect(peerConnection.peer_addr, out connectionCloseNotified);

                            if (connection != null)
                            {
                                Thread.Sleep(3000);
                                resendMessage = true;
                                continue;
                            }
                            else
                            {
                                NCacheLog.Error("DMSender.Run", Name + ". Failed to re-establish connection with " + peerConnection.peer_addr);
                                break;
                            }
                        }
                        else
                        {
                            NCacheLog.Error("DmSender.Run", "secondary connection broken; peer_addr : " + peerConnection.peer_addr);
                            try
                            {
                                foreach (BinaryMessage bMsg in msgsTobeSent)
                                {
                                    try
                                    {
                                        if (bMsg != null && mq != null && !mq.Closed)
                                        {
                                            mq.add(bMsg);
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        NCacheLog.Error("DmSender.Run", "an error occurred while requing the messages. " + ex.ToString());
                                    }
                                }
                            }
                            catch (Exception) { }
                        }

                        break;
                    }
                    catch (QueueClosedException e)
                    {
                        connectionCloseNotified = false;
                        break;
                    }
                    catch (ThreadInterruptedException e)
                    {
                        connectionCloseNotified = false;
                        break;
                    }
                    catch (ThreadAbortException)
                    {
                        break;
                    }
                    catch (System.Exception e)
                    {
                        connectionCloseNotified = false;
                        NCacheLog.Error(Name + "", Name + " exception is " + e.ToString());
                    }
                }
            }
            catch (ThreadInterruptedException) { }
            catch (ThreadAbortException) { }
            catch (Exception ex)
            {
                connectionCloseNotified = false;
                NCacheLog.Error(Name + "", "exception=" + ex.ToString());
            }
            try
            {
                if (!connectionCloseNotified)
                {
                    peerConnection.Enclosing_Instance.notifyConnectionClosed(peerConnection.peer_addr);
                }
                else
                {
                    NCacheLog.CriticalInfo("DmSender.Run", "no need to notify about connection close");
                }

                peerConnection.Enclosing_Instance.remove(peerConnection.peer_addr, peerConnection.IsPrimary);
            }
            catch (Exception e)
            {
                //who cares...
            }
        }