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(); }
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); } }
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); } }
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); } }
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]); }