Beispiel #1
0
        /// <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;
        }
Beispiel #2
0
        /// <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;
        }
Beispiel #3
0
        private bool isCommand()
        {
#if DOTNET2
            Socket socket = new Net.UnionType { Value = asyncEventArgs.AsyncState }.Socket;
            if (socket == Socket)
            {
                receiveCount = socket.EndReceive(asyncEventArgs, out socketError);
                if (socketError == SocketError.Success)
                {
#else
            if (asyncEventArgs.SocketError == SocketError.Success)
            {
                receiveCount = asyncEventArgs.BytesTransferred;
#endif
                if (receiveCount >= sizeof(int))
                {
                    fixed (byte* receiveDataFixed = Buffer.Buffer)
                    {
                        command = *(int*)(bufferStart = receiveDataFixed + Buffer.StartIndex);
                        int commandIndex = base.commandIndex;
                        if (Server.IsCommand(commandIndex))
                        {
                            if (commandIndex != TcpServer.Server.CheckCommandIndex)
                            {
                                if (((uint)command & (uint)TcpServer.CommandFlags.NullData) == 0)
                                {
                                    if (receiveCount >= sizeof(int) * 2)
                                    {
                                        if ((compressionDataSize = *(int*)(bufferStart + sizeof(uint))) > 0)
                                        {
                                            dataSize = compressionDataSize;
                                            receiveIndex = sizeof(int) + sizeof(uint);
                                            return checkCommandData();
                                        }
                                        else if (compressionDataSize < 0 && receiveCount >= (sizeof(int) * 2 + sizeof(uint)))
                                        {
                                            if ((dataSize = *(int*)(bufferStart + (sizeof(uint) + sizeof(int)))) > (compressionDataSize = -compressionDataSize))
                                            {
                                                receiveIndex = sizeof(int) * 2 + sizeof(uint);
                                                return checkCommandData();
                                            }
                                        }
                                    }
                                }
                                else if (receiveCount == sizeof(int) && commandIndex != TcpServer.Server.RemoteExpressionCommandIndex && commandIndex != TcpServer.Server.RemoteExpressionNodeIdCommandIndex)
                                {
                                    return Server.DoCommand(commandIndex, this, ref SubArray<byte>.Null);
                                }
                            }
                            else if (receiveCount == sizeof(int)) return Send(TcpServer.ReturnType.Success);
                        }
                    }
                }
#if DOTNET2
                }
#endif
            }
#if !DOTNET2
            else socketError = asyncEventArgs.SocketError;
#endif
            return false;
        }
Beispiel #4
0
        /// <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 SendState.Asynchronous: return;
                                case 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();
        }
Beispiel #5
0
        /// <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)
                        {
                            if (isDoCommandBig() && 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();
        }
Beispiel #6
0
        /// <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;
                                if (isDoCommandLoop() && 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)
                        {
#if !DotNetStandard
                            while (Interlocked.CompareExchange(ref receiveAsyncLock, 1, 0) != 0) Thread.Sleep(0);
#endif
                            receiveAsyncEventArgs.SetBuffer(ReceiveBuffer.StartIndex + receiveCount, receiveBufferSize - receiveCount);
                            if (socket.ReceiveAsync(receiveAsyncEventArgs))
                            {
#if !DotNetStandard
                                Interlocked.Exchange(ref receiveAsyncLock, 0);
#endif
                                return;
                            }
#if !DotNetStandard
                            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();
        }