/// <summary> /// 处理接收字节流 /// </summary> /// <param name="buffer">字节流</param> /// <param name="size">字节流长度</param> /// <param name="remoteEndPoint">远程地址</param> public void Handle(byte[] buffer, int size, IPEndPoint remoteEndPoint = null) { ReceiveSize += Convert.ToUInt32(size); Log(remoteEndPoint == null ? $"{Socket.Handle} + {size} {ByteConvert.ToHex(buffer, size)}" : $"{Socket.Handle} {remoteEndPoint} + {size} {ByteConvert.ToHex(buffer, size)}"); _residueBuffer.AddRange(buffer.Take(size)); int offset = 0; do { SocketPack packet = _handler.Unpack(Socket, remoteEndPoint, _residueBuffer, offset); if (packet.Result == AnalysisResult.Full) { ReceivedEventArgs args = new ReceivedEventArgs { Socket = Socket, RemoteEndPoint = remoteEndPoint, Channel = this, Buffer = _residueBuffer.GetRange(packet.Offset, packet.Size), ProtocolId = packet.ProtocolId, TimeStamp = packet.TimeStamp }; long timeStamp = TimeStampConvert.ToUtcTimeStamp(); lock (_lockObj) { LinkedListNode <ResponseItem> node = _responseItems.First; while (node != null) { if (node.Value.TimeStamp >= timeStamp) { if (node.Value.Match(args)) { if (node.Value.Action == null) { node.Value.ReceiveBuffer?.AddRange(args.Buffer); node.Value.ResetEvent.Set(); } else { node.Value.Action(args); } LinkedListNode <ResponseItem> nextNode = node.Next; _responseItems.Remove(node); node = nextNode; } else { node = node.Next; } } else { LinkedListNode <ResponseItem> nextNode = node.Next; _responseItems.Remove(node); node = nextNode; } } } Received?.Invoke(this, args); } else if (packet.Result == AnalysisResult.Half) { _residueBuffer.RemoveRange(0, offset); return; } offset += packet.Offset + packet.Size; } while (offset < _residueBuffer.Count); _residueBuffer.Clear(); }