private void ProcessNewData(int receive, SocketBuffer buffer) { buffer.outBuffer.AddRange(buffer.socketBuffer.Take(receive)); do { EnvelopeRead(buffer); if (buffer.outBuffer.Count >= buffer.messageLength) { var msg = buffer.outBuffer.GetRange(0, buffer.messageLength).ToArray(); buffer.outBuffer.RemoveRange(0, buffer.messageLength); OnMessageReceived(msg, buffer.messageKind); buffer.messageKind = MessageKind.Unknown; buffer.messageLength = buffer.outBuffer.Count >= Const.TotalSizeOfEnvelope ? 0 : int.MaxValue; } } while (buffer.outBuffer.Count >= buffer.messageLength); }
private void BeginReceive() { using (mreBeginReceive = new ManualResetEvent(false)) using (var buffer = new SocketBuffer()) { try { while (!closed) { mreBeginReceive.Reset(); socket.BeginReceive(buffer.socketBuffer, 0, Const.BufferSize, SocketFlags.None, EndReceive, buffer); mreInit.SetIfNotNull(); mreBeginReceive.WaitOne(); mreIsConnected.WaitOne(); } } catch (Exception e) { this.HandleError(e); } } }
private void EnvelopeRead(SocketBuffer buffer) { if (buffer.messageKind == MessageKind.Unknown && buffer.outBuffer.Count >= Const.TotalSizeOfEnvelope) { buffer.messageKind = (MessageKind)buffer.outBuffer[0]; if (!Enum.IsDefined(typeof(MessageKind), buffer.messageKind)) { buffer.messageKind = MessageKind.Unknown; throw new FormatException("Doesn't understand the envelope!"); } byte[] length = buffer.outBuffer.GetRange(Const.SizeOfEnvelopeKind, Const.SizeOfEnvelopeLength).ToArray(); buffer.messageLength = length.ToInt(); if (buffer.messageLength > ushort.MaxValue || buffer.messageLength < 0) { throw new ArgumentOutOfRangeException(); } buffer.outBuffer.RemoveRange(0, Const.TotalSizeOfEnvelope); } }