/// <summary> /// 数据发送完成后的回调委托 /// </summary> /// <param name="sender"></param> /// <param name="async">异步回调参数</param> private void onSend(object sender, SocketAsyncEventArgs async) #endif { //IsBuildOutputSynchronize = 0; bool isOutput = false; try { #if DOTNET2 Socket socket = new Net.UnionType { Value = async.AsyncState }.Socket; if (socket == Socket) { SocketError socketError; int count = socket.EndSend(async, out socketError); if (socketError == SocketError.Success) { #else if (sendAsyncEventArgs.SocketError == SocketError.Success) { int count = sendAsyncEventArgs.BytesTransferred; #endif sendData.MoveStart(count); if (sendData.Length == 0) { sendSizeLessCount = 0; freeCopyBuffer(); isOutput = true; } else if (count >= TcpServer.Server.MinSocketSize || (count > 0 && sendSizeLessCount++ == 0)) { switch (send()) { case TcpOpenServer.SendState.Asynchronous: return; case TcpOpenServer.SendState.Synchronize: isOutput = true; break; } } #if DOTNET2 } #endif } } catch (Exception error) { Server.Log.add(AutoCSer.Log.LogType.Debug, error); } if (IsSocket) { if (isOutput) { if (Outputs.IsEmpty) { Interlocked.Exchange(ref IsOutput, 0); //IsOutput = 0; if (!Outputs.IsEmpty) { if (Interlocked.CompareExchange(ref IsOutput, 1, 0) == 0) BuildOutput(); } else { if (!IsSocket && Interlocked.CompareExchange(ref IsOutput, 1, 0) == 0) close(); } } else BuildOutput(); } else closeSocket(); } else close(); }
/// <summary> /// 数据发送完成后的处理 /// </summary> /// <returns></returns> private bool onSend() #endif { #if DOTNET2 System.Net.Sockets.Socket socket = new Net.UnionType { Value = async.AsyncState }.Socket; if (socket == Socket) { SocketError socketError; int count = socket.EndSend(async, out socketError); if (socketError == SocketError.Success) { #else START: if (sendAsyncEventArgs.SocketError == SocketError.Success) { int count = sendAsyncEventArgs.BytesTransferred; System.Net.Sockets.Socket socket; #endif Data.MoveStart(count); if (Data.Length == 0) { SendSizeLessCount = 0; //isShutdown = true; switch (SendType) { case SendType.Next: if (receiveNext()) return true; break; case SendType.Body: switch (HttpResponse.Type) { case ResponseType.ByteArray: Data.Array = HttpResponse.Body.Array; Data.SetFull(); goto SENDDATA; case ResponseType.SubByteArray: case ResponseType.SubBuffer: Data = HttpResponse.Body; SENDDATA: #if DOTNET2 if (socket != Socket) return false; #else if ((socket = Socket) == null) return false; #endif SendType = SendType.Next; Timeout = Config.GetTimeout(Data.Length); #if DOTNET2 async = socket.BeginSend(Data.Array, Data.Start, Data.Length, SocketFlags.None, out socketError, onSendAsyncCallback, socket); if (socketError == SocketError.Success) { if (!async.CompletedSynchronously) Http.Header.ReceiveTimeout.Push(this, socket); return true; } break; #else while (Interlocked.CompareExchange(ref sendAsyncLock, 1, 0) != 0) Thread.Sleep(0); sendAsyncEventArgs.SetBuffer(Data.Array, Data.Start, Data.Length); if (socket.SendAsync(sendAsyncEventArgs)) { Http.Header.ReceiveTimeout.Push(this, socket); Interlocked.Exchange(ref sendAsyncLock, 0); return true; } Interlocked.Exchange(ref sendAsyncLock, 0); goto START; #endif case ResponseType.File: SendFileStream = new FileStream(HttpResponse.BodyFile.FullName, FileMode.Open, FileAccess.Read, FileShare.Read, Http.Header.BufferPool.Size, FileOptions.SequentialScan); if (HttpResponse.State == ResponseState.PartialContent206) SendFileStream.Seek(Header.RangeStart, SeekOrigin.Begin); SendType = SendType.File; Buffer.ToSubByteArray(ref Data); Timeout = Config.GetTimeout(ResponseSize); goto SENDFILE; } break; case SendType.File: SENDFILE: #if DOTNET2 if (socket != Socket) return false; #else if ((socket = Socket) == null) return false; #endif Data.Set(Buffer.StartIndex, (int)Math.Min(ResponseSize, Buffer.Length)); if (SendFileStream.Read(Data.Array, Data.Start, Data.Length) == Data.Length) { if ((ResponseSize -= Data.Length) == 0) SendType = SendType.Next; #if DOTNET2 async = socket.BeginSend(Data.Array, Data.Start, Data.Length, SocketFlags.None, out socketError, onSendAsyncCallback, socket); if (socketError == SocketError.Success) { if (!async.CompletedSynchronously) Http.Header.ReceiveTimeout.Push(this, socket); return true; } #else while (Interlocked.CompareExchange(ref sendAsyncLock, 1, 0) != 0) Thread.Sleep(0); sendAsyncEventArgs.SetBuffer(Data.Start, Data.Length); if (socket.SendAsync(sendAsyncEventArgs)) { Http.Header.ReceiveTimeout.Push(this, socket); Interlocked.Exchange(ref sendAsyncLock, 0); return true; } Interlocked.Exchange(ref sendAsyncLock, 0); goto START; #endif } break; case SendType.GetForm: if (getForm()) return true; break; } } else if ((count >= TcpServer.Server.MinSocketSize || (count > 0 && SendSizeLessCount++ == 0)) && Date.NowTime.Now <= Timeout) { #if DOTNET2 if (socket == Socket) { async = socket.BeginSend(Data.Array, Data.Start, Data.Length, SocketFlags.None, out socketError, onSendAsyncCallback, socket); if (socketError == SocketError.Success) { if (!async.CompletedSynchronously) Http.Header.ReceiveTimeout.Push(this, socket); return true; } } #else if ((socket = Socket) != null) { while (Interlocked.CompareExchange(ref sendAsyncLock, 1, 0) != 0) Thread.Sleep(0); sendAsyncEventArgs.SetBuffer(Data.Start, Data.Length); if (socket.SendAsync(sendAsyncEventArgs)) { Http.Header.ReceiveTimeout.Push(this, socket); Interlocked.Exchange(ref sendAsyncLock, 0); return true; } Interlocked.Exchange(ref sendAsyncLock, 0); goto START; } #endif } #if DOTNET2 } #endif } return false; }