예제 #1
0
        /// <summary>
        /// 释放接收数据缓冲区与异步事件对象
        /// </summary>
        private void close()
        {
            if (Socket != null)
            {
                try
                {
#if DOTNET2
                DisposeSocket();
#else
                    if (asyncEventArgs == null) DisposeSocket();
                    else
                    {
                        asyncEventArgs.Completed -= onReceive;
                        DisposeSocket();
                        SocketAsyncEventArgsPool.PushNotNull(ref asyncEventArgs);
                    }
#endif
                }
                catch (Exception error)
                {
                    Server.AddLog(error);
                }
                Buffer.Free();
                ReceiveBigBuffer.TryFree();
                FreeSerializer();
            }
        }
예제 #2
0
        /// <summary>
        /// 执行命令
        /// </summary>
        /// <returns></returns>
        private bool isDoCommandBig()
        {
#if !DOTNET2
            receiveAsyncEventArgs.SetBuffer(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex, receiveBufferSize);
#endif
            Buffer.BlockCopy(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex + receiveIndex, ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex, receiveCount - receiveIndex);
            if (compressionDataSize == dataSize)
            {
                SubArray<byte> data = new SubArray<byte> { Array = ReceiveBigBuffer.Buffer, Start = ReceiveBigBuffer.StartIndex, Length = dataSize };
                doCommandMark(ref data);
                ReceiveBigBuffer.Free();
            }
            else
            {
                if (MarkData != 0) TcpServer.CommandBuffer.Mark(ReceiveBigBuffer.Buffer, MarkData, ReceiveBigBuffer.StartIndex, compressionDataSize);
                SubBuffer.PoolBufferFull buffer = new SubBuffer.PoolBufferFull { StartIndex = dataSize };
                try
                {
                    AutoCSer.IO.Compression.DeflateDeCompressor.Get(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex, compressionDataSize, ref buffer);
                }
                finally { ReceiveBigBuffer.Free(); }
                if (buffer.Buffer == null) return false;
                if (buffer.PoolBuffer.Pool == null) ++Server.ReceiveNewBufferCount;
                doCommand(ref buffer);
            }
            return true;
        }
예제 #3
0
        /// <summary>
        /// 执行命令
        /// </summary>
        private void doCommandBig()
        {
#if !DOTNET2
            receiveAsyncEventArgs.SetBuffer(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex, receiveBufferSize);
#endif
            Buffer.BlockCopy(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex + receiveIndex, ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex, receiveCount - receiveIndex);
            SubArray<byte> data = new SubArray<byte> { Array = ReceiveBigBuffer.Buffer, Start = ReceiveBigBuffer.StartIndex, Length = compressionDataSize };
            doCommandMark(ref data);
            ReceiveBigBuffer.Free();
        }
예제 #4
0
        /// <summary>
        /// 解压缩并执行命令
        /// </summary>
        /// <returns></returns>
        private bool doCompressionBigDataCommand()
        {
#if !DOTNET2
            receiveAsyncEventArgs.SetBuffer(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex, receiveBufferSize);
#endif
            Buffer.BlockCopy(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex + receiveIndex, ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex, receiveCount - receiveIndex);
            SubBuffer.PoolBufferFull buffer = new SubBuffer.PoolBufferFull { StartIndex = dataSize };
            try
            {
                AutoCSer.IO.Compression.DeflateDeCompressor.Get(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex, compressionDataSize, ref buffer);
            }
            finally { ReceiveBigBuffer.Free(); }
            return doCompressionCommand(ref buffer);
        }
예제 #5
0
 /// <summary>
 /// 回调命令数据
 /// </summary>
 /// <returns></returns>
 private bool isOnBigDataLoopFixed()
 {
     //#if !DOTNET2
     //            receiveAsyncEventArgs.SetBuffer(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex, receiveBufferSize);
     //#endif
     Buffer.BlockCopy(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex + receiveIndex, ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex, receiveCount - receiveIndex);
     if (ReceiveMarkData != 0)
     {
         CommandBuffer.Mark(ReceiveBigBuffer.Buffer, ReceiveMarkData, ReceiveBigBuffer.StartIndex, compressionDataSize);
     }
     if (compressionDataSize == dataSize)
     {
         OnReceive(ref ReceiveBigBuffer);
     }
     else
     {
         SubBuffer.PoolBufferFull buffer = new SubBuffer.PoolBufferFull {
             StartIndex = dataSize
         };
         try
         {
             AutoCSer.IO.Compression.DeflateDeCompressor.Get(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex, compressionDataSize, ref buffer);
         }
         finally { ReceiveBigBuffer.Free(); }
         if (buffer.Buffer == null)
         {
             return(false);
         }
         if (buffer.PoolBuffer.Pool == null)
         {
             ++ClientCreator.CommandClient.ReceiveNewBufferCount;
         }
         OnReceive(ref buffer);
     }
     receiveIndex = receiveCount = 0;
     return(true);
 }
예제 #6
0
        /// <summary>
        /// 执行命令
        /// </summary>
        /// <returns></returns>
        private bool isDoCommandBig()
        {
#if !DOTNET2
            asyncEventArgs.SetBuffer(Buffer.Buffer, Buffer.StartIndex, bufferSize);
#endif
            SubBuffer.PoolBufferFull receiveBigBuffer = ReceiveBigBuffer;
            ReceiveBigBuffer.Clear();
            try
            {
                System.Buffer.BlockCopy(Buffer.Buffer, Buffer.StartIndex + receiveIndex, receiveBigBuffer.Buffer, receiveBigBuffer.StartIndex, receiveCount - receiveIndex);
                if (compressionDataSize == dataSize)
                {
                    SubArray<byte> data = new SubArray<byte> { Array = receiveBigBuffer.Buffer, Start = receiveBigBuffer.StartIndex, Length = dataSize };
                    return doCommandMark(ref data);
                }
                if (MarkData != 0) TcpServer.CommandBuffer.Mark(receiveBigBuffer.Buffer, MarkData, receiveBigBuffer.StartIndex, compressionDataSize);
                SubBuffer.PoolBufferFull buffer = new SubBuffer.PoolBufferFull { StartIndex = dataSize };
                AutoCSer.IO.Compression.DeflateDeCompressor.Get(receiveBigBuffer.Buffer, receiveBigBuffer.StartIndex, compressionDataSize, ref buffer);
                if (buffer.Buffer == null) return false;
                if (buffer.PoolBuffer.Pool == null) ++Server.ReceiveNewBufferCount;
                return doCommand(ref buffer);
            }
            finally { receiveBigBuffer.Free(); }
        }
예제 #7
0
        /// <summary>
        /// 检查命令数据
        /// </summary>
        /// <returns></returns>
        private bool checkCommandData()
        {
            int receiveSize = receiveCount - receiveIndex, nextSize = compressionDataSize - receiveSize;
            if (nextSize == 0) return isDoCommand();
            if (nextSize > 0)
            {
                if (compressionDataSize > bufferSize)
                {
                    SubBuffer.Pool.GetBuffer(ref ReceiveBigBuffer, compressionDataSize);
                    if (ReceiveBigBuffer.Length > Server.SendBufferMaxSize)
                    {
                        if (ReceiveBigBuffer.PoolBuffer.Pool == null) ++Server.ReceiveNewBufferCount;
                        receiveBigBufferCount = receiveSize;
                        SocketType = TcpSimpleServer.ServerSocketType.BigData;
#if !DOTNET2
                        BIGRECEIVE:
#endif
                        Socket socket = Socket;
                        if (socket != null)
                        {
#if DOTNET2
                    socket.BeginReceive(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex + receiveBigBufferCount, compressionDataSize - receiveBigBufferCount, SocketFlags.None, out socketError, asyncCallback, socket);
                    if (socketError == SocketError.Success) return true;
#else
#if !DotNetStandard
                            while (Interlocked.CompareExchange(ref asyncLock, 1, 0) != 0) Thread.Sleep(0);
#endif
                            asyncEventArgs.SetBuffer(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex + receiveBigBufferCount, compressionDataSize - receiveBigBufferCount);
                            if (socket.ReceiveAsync(asyncEventArgs))
                            {
#if !DotNetStandard
                                Interlocked.Exchange(ref asyncLock, 0);
#endif
                                return true;
                            }
                            if (asyncEventArgs.SocketError == SocketError.Success)
                            {
#if !DotNetStandard
                                Interlocked.Exchange(ref asyncLock, 0);
#endif
                                if (compressionDataSize == (receiveBigBufferCount += asyncEventArgs.BytesTransferred)) return isDoCommandBig();
                                goto BIGRECEIVE;
                            }
                            socketError = asyncEventArgs.SocketError;
#endif
                        }
                        return false;
                    }
                    System.Buffer.BlockCopy(Buffer.Buffer, Buffer.StartIndex + receiveIndex, ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex, receiveCount -= receiveIndex);
                    Buffer.Free();
                    ReceiveBigBuffer.CopyToClear(ref Buffer);
#if !DOTNET2
                    asyncEventArgs.SetBuffer(Buffer.Buffer, Buffer.StartIndex, bufferSize = Buffer.Length);
#endif
                    receiveIndex = 0;
                }
                {
                    if (receiveIndex + compressionDataSize > bufferSize)
                    {
                        Memory.CopyNotNull(bufferStart + receiveIndex, bufferStart, receiveCount = receiveSize);
                        receiveIndex = 0;
                    }
                    SocketType = TcpSimpleServer.ServerSocketType.Data;
#if !DOTNET2
                    RECEIVE:
#endif
                    Socket socket = Socket;
                    if (socket != null)
                    {
#if DOTNET2
                    socket.BeginReceive(Buffer.Buffer, Buffer.StartIndex + receiveCount, nextSize, SocketFlags.None, out socketError, asyncCallback, socket);
                    if (socketError == SocketError.Success) return true;
#else
#if !DotNetStandard
                        while (Interlocked.CompareExchange(ref asyncLock, 1, 0) != 0) Thread.Sleep(0);
#endif
                        asyncEventArgs.SetBuffer(Buffer.StartIndex + receiveCount, nextSize);
                        if (socket.ReceiveAsync(asyncEventArgs))
                        {
#if !DotNetStandard
                            Interlocked.Exchange(ref asyncLock, 0);
#endif
                            return true;
                        }
                        if (asyncEventArgs.SocketError == SocketError.Success)
                        {
#if !DotNetStandard
                            Interlocked.Exchange(ref asyncLock, 0);
#endif
                            receiveCount += (receiveSize = asyncEventArgs.BytesTransferred);
                            if ((nextSize -= receiveSize) == 0) return isDoCommand();
                            goto RECEIVE;
                        }
                        socketError = asyncEventArgs.SocketError;
#endif
                    }
                }
            }
            return false;
        }