Ejemplo n.º 1
0
        /// <summary>
        /// 创建输出信息
        /// </summary>
        /// <param name="sender">TCP 服务套接字数据发送</param>
        /// <param name="buildInfo">输出创建参数</param>
        internal override OutputLink Build(ServerSocketSenderBase sender, ref SenderBuildInfo buildInfo)
        {
            UnmanagedStream stream = sender.OutputSerializer.Stream;
            int             dataSize = (Data.Length + (sizeof(int) + 3)) & (int.MaxValue), prepLength = dataSize + (sizeof(uint) + sizeof(int));

            if (buildInfo.Count == 0 || (buildInfo.SendBufferSize - stream.Data.CurrentIndex) >= prepLength ||
                (stream.Data.FreeSize >= prepLength && prepLength > buildInfo.SendBufferSize - TcpServer.ServerOutput.OutputLink.StreamStartIndex))
            {
                OutputLink nextBuild = LinkNext;
                byte *     write     = stream.GetPrepSizeCurrent(prepLength);
                *(uint *)write = ClientCommand.KeepCommand.CustomDataIndex;
                *(int *)(write + sizeof(uint)) = dataSize;
                *(int *)(write + (sizeof(uint) + sizeof(int))) = Data.Length;
                if (Data.Length != 0)
                {
                    fixed(byte *dataFixed = Data.GetFixedBuffer()) AutoCSer.Memory.Common.CopyNotNull(dataFixed + Data.Start, write + (sizeof(uint) + sizeof(int) * 2), Data.Length);
                }
                stream.Data.CurrentIndex += dataSize + (sizeof(uint) + sizeof(int));
                ++buildInfo.Count;
                LinkNext   = null;
                Data.Array = null;
                AutoCSer.Threading.RingPool <CustomDataOutput> .Default.PushNotNull(this);

                return(nextBuild);
            }
            buildInfo.isFullSend = 1;
            return(this);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 创建输出信息
        /// </summary>
        /// <param name="sender">TCP 服务套接字数据发送</param>
        /// <param name="buildInfo">输出创建参数</param>
        internal override OutputLink Build(ServerSocketSenderBase sender, ref SenderBuildInfo buildInfo)
        {
            UnmanagedStream stream = sender.OutputSerializer.Stream;

            if (buildInfo.Count == 0 || (buildInfo.SendBufferSize - stream.ByteSize) >= outputInfo.MaxDataSize)
            {
                int        streamLength = stream.ByteSize;
                OutputLink nextBuild    = LinkNext;
                stream.PrepLength(sizeof(uint) + sizeof(int) * 2);
                stream.ByteSize += sizeof(uint) + sizeof(int);
                if ((Server.GetCommandFlags(ref CommandIndex) & CommandFlags.JsonSerialize) == 0)
                {
                    sender.Serialize(outputInfo, ref outputParameter);
                }
                else
                {
                    sender.JsonSerialize(ref outputParameter);
                }
                int   dataLength = stream.ByteSize - streamLength - (sizeof(uint) + sizeof(int));
                byte *dataFixed  = stream.Data.Byte + streamLength;
                *(uint *)dataFixed = CommandIndex;
                *(int *)(dataFixed + sizeof(uint)) = dataLength;
                outputInfo.CheckMaxDataSize(Math.Max(dataLength + (sizeof(uint) + sizeof(int)), stream.LastPrepSize - streamLength));
                ++buildInfo.Count;
                LinkNext        = null;
                outputParameter = default(outputParameterType);
                AutoCSer.Threading.RingPool <Output <outputParameterType> > .Default.PushNotNull(this);

                return(nextBuild);
            }
            buildInfo.isFullSend = 1;
            return(this);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 创建输出信息
        /// </summary>
        /// <param name="sender">TCP 服务套接字数据发送</param>
        /// <param name="buildInfo">输出创建参数</param>
        internal unsafe override OutputLink Build(ServerSocketSenderBase sender, ref TcpServer.SenderBuildInfo buildInfo)
        {
            UnmanagedStream stream = sender.OutputSerializer.Stream;

            if ((buildInfo.SendBufferSize - stream.ByteSize) >= sizeof(int))
            {
                OutputLink nextBuild = LinkNext;
                *(int *)stream.CurrentData = (byte)ReturnType;
                LinkNext         = null;
                stream.ByteSize += sizeof(int);
                AutoCSer.Threading.RingPool <ReturnTypeOutput> .Default.PushNotNull(this);

                return(nextBuild);
            }
            buildInfo.isFullSend = 1;
            return(this);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 创建输出信息
        /// </summary>
        /// <param name="sender">TCP 服务套接字数据发送</param>
        /// <param name="buildInfo">输出创建参数</param>
        internal unsafe override OutputLink Build(ServerSocketSenderBase sender, ref SenderBuildInfo buildInfo)
        {
            UnmanagedStream stream = sender.OutputSerializer.Stream;

            if ((buildInfo.SendBufferSize - stream.Data.CurrentIndex) >= sizeof(uint))
            {
                OutputLink nextBuild = LinkNext;
                stream.Data.Write(CommandIndex);
                LinkNext = null;
                ++buildInfo.Count;
                AutoCSer.Threading.RingPool <ReturnTypeOutput> .Default.PushNotNull(this);

                return(nextBuild);
            }
            buildInfo.isFullSend = 1;
            return(this);
        }
Ejemplo n.º 5
0
 /// <summary>
 /// 创建输出信息
 /// </summary>
 /// <param name="sender">TCP 服务套接字数据发送</param>
 /// <param name="buildInfo">输出创建参数</param>
 internal abstract outputLinkType Build(ServerSocketSenderBase sender, ref SenderBuildInfo buildInfo);