static void ServeSegment(RioSocket socket) { socket.SetLinger(0); var reader = new RioSegmentReader <ServeState>(socket); reader.State = new ServeState(); reader.State.leftoverLength = 0; reader.State.oldleftoverLength = 0; reader.State.reader = reader; reader.State.socket = socket; reader.OnIncommingSegment = ProcessSocket; reader.Start(); }
public async static Task <ConnectionState> ExecuteStream() { var buffer = new byte[256 * pipeLineDeph]; var leftoverLength = 0; var oldleftoverLength = 0; uint endOfRequest = 0x0a0d0a0d; uint current = 0; int responses = 0; ConnectionState state = new ConnectionState(); RioSocket connection = null; RioStream stream = null; while (timer.Elapsed < span) { if (connection == null) { try { connection = await clientPool.Connect(uri); connection.SetLinger(0); stream = new RioStream(connection); //stream.Dispose(); } catch (Exception e) { Debug.WriteLine(e.Message); continue; } } //check if connection is valid? connection.Send(reqz[pipeLineDeph]); while (responses < pipeLineDeph) { int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); if (bytesRead == 0) { break; } for (int i = 0; leftoverLength != 0 && i < 4 - leftoverLength; i++) { current += buffer[i]; current = current << 8; if (current == endOfRequest) { responses++; } } leftoverLength = bytesRead % 4; var length = bytesRead - leftoverLength; unsafe { fixed(byte *data = &buffer[oldleftoverLength]) { var start = data; var end = data + length; for (; start <= end; start++) { if (*(uint *)start == endOfRequest) { responses++; } } } } oldleftoverLength = leftoverLength; for (int i = bytesRead - leftoverLength; i < bytesRead; i++) { current += buffer[i]; current = current << 4; } } state.Requests += responses; responses = 0; if (!keepAlive) { stream.Dispose(); connection.Dispose(); connection = null; stream = null; Thread.Sleep(100); } } stream?.Dispose(); connection?.Dispose(); return(state); }