Esempio n. 1
0
 private void Receive(byte[] data, int offset, int count)
 {
     System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(new System.IO.MemoryStream(data, offset, count));
     while (binaryReader.BaseStream.Length - binaryReader.BaseStream.Position > 0L)
     {
         if (this.m_messagePart == null)
         {
             this.m_messagePart = new IPCMessagePart();
         }
         this.m_messagePart.Build(binaryReader, binaryReader.BaseStream.Length - binaryReader.BaseStream.Position);
         if (!this.m_messagePart.IsValid)
         {
             break;
         }
         IPCMessage message;
         try
         {
             message = Singleton <IPCMessageSerializer> .Instance.Deserialize(this.m_messagePart.Data);
         }
         catch (System.Exception arg)
         {
             IPCAccessor.logger.Error("Cannot deserialize received message ! Exception : {0}" + arg);
             break;
         }
         finally
         {
             this.m_messagePart = null;
         }
         this.TaskPool.AddMessage(delegate
         {
             this.ProcessMessage(message);
         });
     }
 }
Esempio n. 2
0
        internal void ProcessReceive(byte[] data, int offset, int count)
        {
            try
            {
                LastActivity = DateTime.Now;
                System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(new System.IO.MemoryStream(data, offset, count));
                while (binaryReader.BaseStream.Length - binaryReader.BaseStream.Position > 0L)
                {
                    if (m_messagePart == null)
                    {
                        m_messagePart = new IPCMessagePart();
                    }
                    m_messagePart.Build(binaryReader, binaryReader.BaseStream.Length - binaryReader.BaseStream.Position);
                    if (!m_messagePart.IsValid)
                    {
                        break;
                    }

                    IPCMessage message;
                    try
                    {
                        message = IPCMessageSerializer.Instance.Deserialize(m_messagePart.Data);
                    }
                    catch (System.Exception arg)
                    {
                        logger.Error("Cannot deserialize received message ! Exception : {0}" + arg);
                        break;
                    }
                    finally
                    {
                        m_messagePart = null;
                    }

                    if (m_recvLockAcquired)
                    {
                        IPCClient.logger.Error("Recv lock should not be set 'cause it's mono thread !");
                    }
                    Monitor.Enter(m_recvLock, ref m_recvLockAcquired);
                    try
                    {
                        ProcessMessage(message);
                    }
                    finally
                    {
                        Monitor.Exit(m_recvLock);
                        m_recvLockAcquired = false;
                    }
                }
            }
            catch (Exception arg)
            {
                IPCClient.logger.Error("Forced disconnection during reception : " + arg);
                Disconnect();
            }
        }
Esempio n. 3
0
        protected virtual bool BuildMessage(BufferSegment buffer)
        {
            if (m_messagePart == null)
            {
                m_messagePart = new IPCMessagePart();
            }

            var reader = new FastBigEndianReader(buffer)
            {
                Position    = buffer.Offset + m_readOffset,
                MaxPosition = buffer.Offset + m_readOffset + m_remainingLength,
            };

            // if message is complete
            if (m_messagePart.Build(reader))
            {
                var dataPos = reader.Position;
                // prevent to read above
                reader.MaxPosition = dataPos + m_messagePart.Length.Value;

                IPCMessage message;
                try
                {
                    message = IPCMessageSerializer.Instance.Deserialize(m_messagePart.Data);
                }
                catch (Exception)
                {
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    logger.Debug("Message = {0}", m_messagePart.Data.ToString(" "));
                    throw;
                }

                LastActivity = DateTime.Now;

                TaskPool.AddMessage(() => ProcessMessage(message));

                m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
                m_writeOffset      = m_readOffset = (int)reader.Position - buffer.Offset;
                m_messagePart      = null;

                return(m_remainingLength <= 0 || BuildMessage(buffer));
            }

            m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
            m_readOffset       = (int)reader.Position - buffer.Offset;
            m_writeOffset      = m_readOffset + m_remainingLength;

            EnsureBuffer(m_messagePart.Length.HasValue ? m_messagePart.Length.Value : 3);

            return(false);
        }
Esempio n. 4
0
        protected virtual bool BuildMessage(BufferSegment buffer)
        {
            if (m_messagePart == null)
            {
                m_messagePart = new IPCMessagePart();
            }

            var reader = new FastBigEndianReader(buffer)
            {
                Position    = buffer.Offset + m_readOffset,
                MaxPosition = buffer.Offset + m_readOffset + m_remainingLength,
            };

            bool built;

            try
            {
                built = m_messagePart.Build(reader);
            }
            catch
            {
                logger.Error("Cannot build message. Length={0} LengthSize={3} RemainingLength={1} Data={2}", m_messagePart.Length, m_remainingLength, m_messagePart.Data, m_messagePart.LengthBytesCount);
                throw;
            }

            // if message is complete
            if (built)
            {
                var dataPos = reader.Position;
                // prevent to read above
                reader.MaxPosition = dataPos + m_messagePart.Length.Value;

                IPCMessage message;
                try
                {
                    message = IPCMessageSerializer.Instance.Deserialize(m_messagePart.Data);
                }
                catch (Exception ex)
                {
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    logger.Debug("Message = {0}", m_messagePart.Data.ToString(" "));
                    logger.Error("Error while deserializing IPC Message : " + ex);

                    return(m_remainingLength <= 0 || BuildMessage(buffer));
                }

                TaskPool.AddMessage(() => ProcessMessage(message));

                m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
                m_writeOffset      = m_readOffset = (int)reader.Position - buffer.Offset;
                m_messagePart      = null;

                return(m_remainingLength <= 0 || BuildMessage(buffer));
            }

            m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
            m_readOffset       = (int)reader.Position - buffer.Offset;
            m_writeOffset      = m_readOffset + m_remainingLength;

            EnsureBuffer(m_messagePart.Length.HasValue ? m_messagePart.Length.Value : 5);

            return(false);
        }