/// <summary> /// 接受头部换行数据 /// </summary> /// <param name="result">异步操作状态</param> private unsafe void onReceive(IAsyncResult result) { if (IsKeepAliveReceive) { if (!result.CompletedSynchronously) { KeepAliveReceiveTimeout.Cancel(httpSocket); } IsKeepAliveReceive = false; } else if (!result.CompletedSynchronously) { ReceiveTimeout.Cancel(httpSocket); } try { int count = httpSocket.SslStream.EndRead(result); if (count > 0) { receiveCount += count; if (searchEnd()) return; } if (receiveCount != ReceiveBufferSize && (count >= TcpServer.Server.MinSocketSize || ReceiveSizeLessCount++ == 0)) { if (!httpSocket.SslStream.BeginRead(Buffer.Buffer, Buffer.StartIndex + receiveCount, ReceiveBufferSize - receiveCount, receiveCallback, this).CompletedSynchronously) { ReceiveTimeout.Push(httpSocket, socket); } } } }
/// <summary> /// 接收数据完成后的回调 /// </summary> /// <param name="sender"></param> /// <param name="async">异步回调参数</param> private void onReceive(object sender, SocketAsyncEventArgs async) #endif { try { #if DOTNET2 if (IsKeepAliveReceive) { if (!async.CompletedSynchronously) KeepAliveReceiveTimeout.Cancel(httpSocket); } IsKeepAliveReceive = false; } else if (!async.CompletedSynchronously) { ReceiveTimeout.Cancel(httpSocket); } if (onReceiveAsync(async)) { return; } #else if (IsKeepAliveReceive) { KeepAliveReceiveTimeout.Cancel(httpSocket); IsKeepAliveReceive = false; } else { ReceiveTimeout.Cancel(httpSocket); } if (onReceive()) { return; } #endif }
/// <summary> /// 接收数据下一个请求数据 /// </summary> internal void ReceiveNext() { try { int receiveSize = receiveCount - receiveIndex; if (receiveSize == 0) { receiveIndex = receiveCount = HeaderEndIndex = 0; } else { HeaderEndIndex = receiveIndex; if (searchEnd()) { return; fixed(byte *bufferFixed = Buffer.Buffer) { byte *start = bufferFixed + Buffer.StartIndex; Memory.CopyNotNull(start + receiveIndex, start, receiveCount = receiveSize); } HeaderEndIndex -= receiveIndex; receiveIndex = 0; } //isHeader = 0; IsKeepAliveReceive = true; #if DOTNET2 SocketError socketError; IAsyncResult async = socket.BeginReceive(Buffer.Buffer, Buffer.StartIndex + receiveCount, ReceiveBufferSize - receiveCount, SocketFlags.None, out socketError, onReceiveAsyncCallback, socket); if (socketError == SocketError.Success) { if (!async.CompletedSynchronously) { KeepAliveReceiveTimeout.Push(httpSocket, socket); } return; } #else while (Interlocked.CompareExchange(ref httpSocket.ReceiveAsyncLock, 1, 0) != 0) { Thread.Sleep(0); } receiveAsyncEventArgs.SetBuffer(Buffer.StartIndex + receiveCount, ReceiveBufferSize - receiveCount); if (socket.ReceiveAsync(receiveAsyncEventArgs)) { KeepAliveReceiveTimeout.Push(httpSocket, socket); Interlocked.Exchange(ref httpSocket.ReceiveAsyncLock, 0); return; } Interlocked.Exchange(ref httpSocket.ReceiveAsyncLock, 0); if (onReceive()) { return; } #endif } catch (Exception error) { httpSocket.Server.RegisterServer.TcpServer.Log.Add(Log.LogType.Debug, error); } //if (isHeader == 0) httpSocket.HeaderError(); }
/// <summary> /// 接收数据下一个请求数据 /// </summary> internal void ReceiveNext() { try { int receiveSize = receiveCount - receiveIndex; if (receiveSize == 0) { receiveIndex = receiveCount = HeaderEndIndex = 0; } else { HeaderEndIndex = receiveIndex; if (searchEnd()) { return; fixed(byte *bufferFixed = Buffer.GetFixedBuffer()) { byte *start = bufferFixed + Buffer.StartIndex; AutoCSer.Memory.Common.CopyNotNull(start + receiveIndex, start, receiveCount = receiveSize); } HeaderEndIndex -= receiveIndex; receiveIndex = 0; } //isHeader = 0; IsKeepAliveReceive = true; #if DOTNET2 SocketError socketError; IAsyncResult async = socket.BeginReceive(Buffer.Buffer, Buffer.StartIndex + receiveCount, ReceiveBufferSize - receiveCount, SocketFlags.None, out socketError, onReceiveAsyncCallback, socket); if (socketError == SocketError.Success) { if (!async.CompletedSynchronously) { KeepAliveReceiveTimeout.Push(httpSocket, socket); } return; } #else httpSocket.ReceiveAsyncLock.EnterSleepFlag(); receiveAsyncEventArgs.SetBuffer(Buffer.StartIndex + receiveCount, ReceiveBufferSize - receiveCount); if (socket.ReceiveAsync(receiveAsyncEventArgs)) { httpSocket.ReceiveAsyncLock.SleepFlag = 0; KeepAliveReceiveTimeout.Push(httpSocket, socket); httpSocket.ReceiveAsyncLock.Exit(); return; } httpSocket.ReceiveAsyncLock.ExitSleepFlag(); if (onReceive()) { return; } #endif } catch (Exception error) { httpSocket.Server.RegisterServer.TcpServer.Log.Exception(error, null, LogLevel.Exception | LogLevel.AutoCSer); } //if (isHeader == 0) httpSocket.HeaderError(); }