/// <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(); } }
/// <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; }
/// <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(); }
/// <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); }
/// <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); }
/// <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(); } }
/// <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; }