/// <summary> /// 获取数据 /// </summary> private void dataAsync() { try { #if DOTNET2 Socket socket = new Net.UnionType { Value = receiveAsyncEventArgs.AsyncState }.Socket; if (socket == Socket) { receiveCount += socket.EndReceive(receiveAsyncEventArgs, out socketError); if (socketError == SocketError.Success) { #else CHECK: if (receiveAsyncEventArgs.SocketError == SocketError.Success) { receiveCount += receiveAsyncEventArgs.BytesTransferred; #endif if (compressionDataSize <= receiveCount - receiveIndex) { fixed (byte* receiveDataFixed = ReceiveBuffer.Buffer) { receiveDataStart = receiveDataFixed + ReceiveBuffer.StartIndex; doCommandLoop(); if (loop(false)) return; } } else { #if DOTNET2 if (socket == Socket) { socket.BeginReceive(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex + receiveCount, receiveBufferSize - receiveCount, SocketFlags.None, out socketError, onReceiveAsyncCallback, socket); if (socketError == SocketError.Success) return; } #else Socket socket = Socket; if (socket != null) { receiveAsyncEventArgs.SetBuffer(ReceiveBuffer.StartIndex + receiveCount, receiveBufferSize - receiveCount); if (socket.ReceiveAsync(receiveAsyncEventArgs)) return; goto CHECK; } #endif } #if DOTNET2 } #endif } #if !DOTNET2 else socketError = receiveAsyncEventArgs.SocketError; #endif } catch (Exception error) { Server.Log.add(AutoCSer.Log.LogType.Debug, error); } close(); }
/// <summary> /// 获取数据 /// </summary> /// <returns></returns> private bool bigDataAsync() { #if DOTNET2 if (!receiveAsyncEventArgs.CompletedSynchronously) Server.CancelReceiveVerifyCommandTimeout(this); Socket socket = new Net.UnionType { Value = receiveAsyncEventArgs.AsyncState }.Socket; if (socket == Socket) { int count = socket.EndReceive(receiveAsyncEventArgs, out socketError); if (socketError == SocketError.Success) { #else Server.CancelReceiveVerifyCommandTimeout(this); CHECK: if (receiveAsyncEventArgs.SocketError == SocketError.Success) { int count = receiveAsyncEventArgs.BytesTransferred; #endif int nextSize = compressionDataSize - (receiveBigBufferCount += count); if (nextSize == 0) { ReceiveSizeLessCount = 0; doCommandBig(); if (isReceiveCommand()) return true; } else if (count >= TcpServer.Server.MinSocketSize || (count > 0 && ReceiveSizeLessCount++ == 0)) { #if DOTNET2 if (socket == Socket) { IAsyncResult async = socket.BeginReceive(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex + receiveBigBufferCount, nextSize, SocketFlags.None, out socketError, onReceiveAsyncCallback, socket); if (socketError == SocketError.Success) { if (!async.CompletedSynchronously) Server.PushReceiveVerifyCommandTimeout(this, Socket); return true; } } #else Socket socket = Socket; if (socket != null) { receiveAsyncEventArgs.SetBuffer(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex + receiveBigBufferCount, nextSize); if (socket.ReceiveAsync(receiveAsyncEventArgs)) { Server.PushReceiveVerifyCommandTimeout(this, Socket); return true; } goto CHECK; } #endif } #if DOTNET2 } #endif } #if !DOTNET2 else socketError = receiveAsyncEventArgs.SocketError; #endif return false; }
/// <summary> /// 获取数据 /// </summary> private void compressionDataAsync() { try { #if DOTNET2 Socket socket = new Net.UnionType { Value = receiveAsyncEventArgs.AsyncState }.Socket; if (socket == Socket) { receiveCount += socket.EndReceive(receiveAsyncEventArgs, out socketError); if (socketError == SocketError.Success) { #else CHECK: if (receiveAsyncEventArgs.SocketError == SocketError.Success) { receiveCount += receiveAsyncEventArgs.BytesTransferred; #endif int nextSize = compressionDataSize - (receiveCount - receiveIndex); if (nextSize == 0) { if (doCompressionCommand() && isReceiveCommand()) return; } else { #if DOTNET2 if (socket == Socket) { socket.BeginReceive(ReceiveBuffer.Buffer, ReceiveBuffer.StartIndex + receiveCount, nextSize, SocketFlags.None, out socketError, onReceiveAsyncCallback, socket); if (socketError == SocketError.Success) return; } #else Socket socket = Socket; if (socket != null) { receiveAsyncEventArgs.SetBuffer(ReceiveBuffer.StartIndex + receiveCount, nextSize); if (socket.ReceiveAsync(receiveAsyncEventArgs)) return; goto CHECK; } #endif } #if DOTNET2 } #endif } #if !DOTNET2 else socketError = receiveAsyncEventArgs.SocketError; #endif } catch (Exception error) { Server.Log.add(AutoCSer.Log.LogType.Debug, error); } close(); }
/// <summary> /// 获取数据 /// </summary> private void bigDataAsync() { try { #if DOTNET2 Socket socket = new Net.UnionType { Value = receiveAsyncEventArgs.AsyncState }.Socket; if (socket == Socket) { receiveBigBufferCount += socket.EndReceive(receiveAsyncEventArgs, out socketError); if (socketError == SocketError.Success) { #else CHECK: if (receiveAsyncEventArgs.SocketError == SocketError.Success) { receiveBigBufferCount += receiveAsyncEventArgs.BytesTransferred; #endif int nextSize = compressionDataSize - receiveBigBufferCount; if (nextSize == 0) { doCommandBig(); if (isReceiveCommand()) return; } else { #if DOTNET2 if (socket == Socket) { socket.BeginReceive(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex + receiveBigBufferCount, nextSize, SocketFlags.None, out socketError, onReceiveAsyncCallback, socket); if (socketError == SocketError.Success) return; } #else Socket socket = Socket; if (socket != null) { #if !DotNetStandard while (Interlocked.CompareExchange(ref receiveAsyncLock, 1, 0) != 0) Thread.Sleep(0); #endif receiveAsyncEventArgs.SetBuffer(ReceiveBigBuffer.Buffer, ReceiveBigBuffer.StartIndex + receiveBigBufferCount, nextSize); if (socket.ReceiveAsync(receiveAsyncEventArgs)) { #if !DotNetStandard Interlocked.Exchange(ref receiveAsyncLock, 0); #endif return; } #if !DotNetStandard Interlocked.Exchange(ref receiveAsyncLock, 0); #endif goto CHECK; } #endif } #if DOTNET2 } #endif } #if !DOTNET2 else socketError = receiveAsyncEventArgs.SocketError; #endif } catch (Exception error) { Server.Log.Add(AutoCSer.Log.LogType.Debug, error); } close(); }
/// <summary> /// 数据接收完成后的处理 /// </summary> /// <returns></returns> private bool onReceive() #endif { #if DOTNET2 System.Net.Sockets.Socket socket = new Net.UnionType { Value = async.AsyncState }.Socket; if (socket == Socket) { SocketError socketError; int count = socket.EndReceive(async, out socketError); if (socketError == SocketError.Success) { #else START: if (receiveAsyncEventArgs.SocketError == SocketError.Success) { int count = receiveAsyncEventArgs.BytesTransferred; #endif Data.MoveStart(count); if (Data.Length == 0) { ReceiveSizeLessCount = 0; switch (ReceiveType) { case ReceiveType.Response: if ((Header.ContentLength -= Buffer.Length) <= 0) return responseHeader(); Data.Set(Buffer.Buffer, Buffer.StartIndex, Math.Min(Header.ContentLength, Buffer.Length)); #if DOTNET2 if (socket == Socket) { async = socket.BeginReceive(Data.Array, Data.Start, Data.Length, SocketFlags.None, out socketError, onReceiveAsyncCallback, socket); if (socketError == SocketError.Success) { if (!async.CompletedSynchronously) Http.Header.ReceiveTimeout.Push(this, socket); return true; } } return false; #else System.Net.Sockets.Socket socket = Socket; if (socket == null) return false; while (Interlocked.CompareExchange(ref ReceiveAsyncLock, 1, 0) != 0) Thread.Sleep(0); receiveAsyncEventArgs.SetBuffer(Data.Array, Data.Start, Data.Length); if (socket.ReceiveAsync(receiveAsyncEventArgs)) { Http.Header.ReceiveTimeout.Push(this, socket); Interlocked.Exchange(ref ReceiveAsyncLock, 0); return true; } Interlocked.Exchange(ref ReceiveAsyncLock, 0); goto START; #endif case ReceiveType.GetForm: return OnGetForm(); } } if ((count >= TcpServer.Server.MinSocketSize || (count > 0 && ReceiveSizeLessCount++ == 0)) && Date.NowTime.Now <= Timeout) { #if DOTNET2 if (socket == Socket) { async = socket.BeginReceive(Data.Array, Data.Start, Data.Length, SocketFlags.None, out socketError, onReceiveAsyncCallback, socket); if (socketError == SocketError.Success) { if (!async.CompletedSynchronously) Http.Header.ReceiveTimeout.Push(this, socket); return true; } } #else System.Net.Sockets.Socket socket = Socket; if (socket == null) return false; while (Interlocked.CompareExchange(ref ReceiveAsyncLock, 1, 0) != 0) Thread.Sleep(0); receiveAsyncEventArgs.SetBuffer(Data.Start, Data.Length); if (socket.ReceiveAsync(receiveAsyncEventArgs)) { Http.Header.ReceiveTimeout.Push(this, socket); Interlocked.Exchange(ref ReceiveAsyncLock, 0); return true; } Interlocked.Exchange(ref ReceiveAsyncLock, 0); goto START; #endif } #if DOTNET2 } #endif } return false; }