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