예제 #1
0
        static void Main(string[] args)
        {
            pipeLineDeph = int.Parse(args.FirstOrDefault(f => f.StartsWith("-p"))?.Substring(2) ?? "16");
            int connections = int.Parse(args.FirstOrDefault(f => f.StartsWith("-c"))?.Substring(2) ?? "1024");

            Console.WriteLine("RioSharp http server");
            Console.WriteLine("Optimizing for " + connections + " connections");
            Console.WriteLine("Optimizing for pipeline depth of: " + pipeLineDeph);

            sendPool   = new RioFixedBufferPool(10 * connections, 256 * pipeLineDeph);
            recivePool = new RioFixedBufferPool(10 * connections, 256 * pipeLineDeph);

            listener       = new RioTcpListener(sendPool, recivePool, (uint)connections);
            currentSegment = listener.PreAllocateWrite(GetResponse());
            responseBytes  = GetResponse();
            //Task.Run(async () =>
            //{
            //    while (true)
            //    {
            //        UpdateResponse();
            //        await Task.Delay(60000);
            //    }
            //});

            listener.OnAccepted = new Action <RioSocket>(s => ThreadPool.QueueUserWorkItem(o => Servebuff((RioSocket)o), s));
            listener.Listen(new IPEndPoint(new IPAddress(new byte[] { 0, 0, 0, 0 }), 5000), 1024 * connections);
            Console.WriteLine("Listening on : http://localhost:5000");
            Console.WriteLine("Press enter to exit");
            Console.ReadLine();

            listener.Dispose();
        }
예제 #2
0
        static unsafe void ProcessSocket(RioBufferSegment s, ConnectionState state)
        {
            uint current   = 0;
            var  r         = s.CurrentContentLength;
            var  responses = 0;

            if (r == 0)
            {
                ResetConnection(state);
                return;
            }

            for (int i = 0; state.leftoverLength != 0 && i < 4 - state.leftoverLength; i++)
            {
                current += s.DataPointer[i];
                current  = current << 8;
                if (current == endOfRequest)
                {
                    responses++;
                }
            }

            state.leftoverLength = r % 4;
            var length = r - state.leftoverLength;

            byte *currentPtr = s.DataPointer + state.oldleftoverLength;

            var start = currentPtr;
            var end   = currentPtr + length;

            for (; start <= end; start++)
            {
                if (*(uint *)start == endOfRequest)
                {
                    responses++;
                }
            }

            state.oldleftoverLength = state.leftoverLength;

            for (int i = r - state.leftoverLength; i < r; i++)
            {
                current += s.DataPointer[i];
                current  = current << 4;
            }

            state.Requests += responses;

            if (timer.Elapsed < span)
            {
                state.socket.Send(reqz[responses]);
            }
            else
            {
                state.reader.Dispose();
                state.socket.Dispose();
                state.tcs.SetResult(state);
            }
        }
예제 #3
0
        private void Send(RioBufferSegment segment, bool flushSends)
        {
            var sendCorrelation = flushSends ? CompleteSendCorrelation() : PartialSendCorrelation;
            var sendFlags       = flushSends ? MessageEnd : MessagePart;

            if (!_rio.Send(_requestQueue, ref segment, 1, sendFlags, sendCorrelation))
            {
                ThrowError(ErrorType.Send);
            }
        }
예제 #4
0
파일: Program.cs 프로젝트: aL3891/RioSharp
        static unsafe void ProcessSocket(RioBufferSegment s, ConnectionState state)
        {
            uint current = 0;
            var r = s.CurrentContentLength;
            var responses = 0;

            if (r == 0)
            {
                ResetConnection(state);
                return;
            }

            for (int i = 0; state.leftoverLength != 0 && i < 4 - state.leftoverLength; i++)
            {
                current += s.DataPointer[i];
                current = current << 8;
                if (current == endOfRequest)
                    responses++;
            }

            state.leftoverLength = r % 4;
            var length = r - state.leftoverLength;

            byte* currentPtr = s.DataPointer + state.oldleftoverLength;

            var start = currentPtr;
            var end = currentPtr + length;

            for (; start <= end; start++)
            {
                if (*(uint*)start == endOfRequest)
                    responses++;
            }

            state.oldleftoverLength = state.leftoverLength;

            for (int i = r - state.leftoverLength; i < r; i++)
            {
                current += s.DataPointer[i];
                current = current << 4;
            }

            state.Requests += responses;

            if (timer.Elapsed < span)
                state.socket.Send(reqz[responses]);
            else
            {
                state.reader.Dispose();
                state.socket.Dispose();
                state.tcs.SetResult(state);
            }
        }
예제 #5
0
        static unsafe void ProcessSocket(RioBufferSegment s, ServeState state)
        {
            uint current = 0;
            var  r       = s.CurrentContentLength;
            var  reqs    = 0;

            if (r == 0)
            {
                state.reader.Dispose();
                state.socket.Dispose();
                return;
            }

            for (int i = 0; state.leftoverLength != 0 && i < 4 - state.leftoverLength; i++)
            {
                current += s.DataPointer[i];
                current  = current << 8;
                if (current == endOfRequest)
                {
                    reqs++;
                }
            }

            state.leftoverLength = r % 4;
            var length = r - state.leftoverLength;

            byte *currentPtr = s.DataPointer + state.oldleftoverLength;

            var start = currentPtr;
            var end   = currentPtr + length;

            for (; start <= end; start++)
            {
                if (*(uint *)start == endOfRequest)
                {
                    reqs++;
                }
            }

            state.oldleftoverLength = state.leftoverLength;

            for (int i = r - state.leftoverLength; i < r; i++)
            {
                current += s.DataPointer[i];
                current  = current << 4;
            }

            state.socket.Send(reqz[reqs]);
        }