예제 #1
0
        /// <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();
        }