public override void PacketReceived(ISessionFilterChain filterChain, IPacket packet)
            {
                if (packet == null || filterChain.Session != base._session)
                {
                    base.PacketReceived(filterChain, packet);
                }
                else
                {
                    lock (this)
                    {
                        if (_content == null)
                        {
                            _content  = packet.Buffer;
                            _endPoint = packet.EndPoint;
                        }
                        else
                        {
                            IBuffer content = packet.Buffer;

                            if (_content.Remaining < content.Remaining)
                            {
                                IBuffer buffer = BufferFactory.GetBuffer(
                                    _content.Position + content.Remaining);

                                buffer.Put(_content.Flip());
                                _content.Release();
                                _content = buffer;
                            }

                            _content.Put(content);
                            _content.Flip();
                        }

                        if (_content != null)
                        {
                            try
                            {
                                base.Recognize(_content, _endPoint);
                            }
                            finally
                            {
                                if (_content.HasRemaining)
                                {
                                    _content.Compact();
                                }
                                else
                                {
                                    _content.Release();
                                    _content  = null;
                                    _endPoint = null;
                                }
                            }
                        }
                    }
                }
            }
Beispiel #2
0
        public static IBuffer ToBuffer(DefaultMessage message, Func <object, byte[]> messageBodyEncoder)
        {
            byte[]  data   = messageBodyEncoder(message.Obj);
            IBuffer buffer = BufferFactory.GetBuffer(data.Length + DefaultMessageHeader.HeaderLength);

            message.Header.Length = data.Length;
            message.Header.Write(buffer);
            System.Buffer.BlockCopy(data, 0, buffer.ByteArray,
                                    DefaultMessageHeader.HeaderLength, data.Length);
            return(buffer);
        }
Beispiel #3
0
        protected virtual IPacket DoProcessReceive(SocketAsyncEventArgs args)
        {
            if (!base.IsOpened)
            {
                return(null);
            }

            if (!CheckSendOrReceiveSuccess(args))
            {
                Close();
                return(null);
            }

            int     receiveCount = args.BytesTransferred;
            IBuffer buffer       = BufferFactory.GetBuffer(receiveCount);

            System.Buffer.BlockCopy(args.Buffer, args.Offset, buffer.ByteArray, 0, receiveCount);
            return(new DefaultPacket(buffer, RemoteEndPoint));
        }